質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

6回答

10891閲覧

文字列の数値かそれ以外かの判断

R.lawliet

総合スコア41

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/04/21 08:24

編集2015/04/21 10:05

いつもお世話になっております。

受け取ったString文字列が数値かそうでないか、を判断するコードを作る課題があったので、自分なりに作りました。
こちらです↓

/*
コマンドライン引数より取得した文字列が
数字であれば「true」を、
文字であれば「false」を返すプログラムを作成せよ。
*/

lang

1package no211_Test_22; 2 3public class Test14 { 4 public static void main(String[] args) { 5 String str = args[0]; 6 int i = 0; 7 int len = str.length(); 8 char ch = str.charAt(i); 9 while (i < len){ 10 boolean result = Character.isDigit(ch); 11 if(i == len){ 12 System.out.println(true); 13 } else { 14 System.out.println(result); 15 break; 16 } 17 i++; 18 } 19 } 20}

Character.isDigit()ではString文字列を扱えないので
charAt(i)を用いてループを回し1つずつ確認させる、というやり方です。

先生に提出したところ、
処理が面倒くさいのでもっと簡単なのにしろ、と言われたのですが、
どうしても上手くまとめる方法が思いつきません。

どなたか知恵をお貸し下さい。
よろしくお願いします。

↓以下修正後

lang

1public class Test14 { 2 public static void main(String[] args) { 3 try { 4 int number = Integer.parseInt(args[0]); 5 6 System.out.println(true); 7 8 } catch (NumberFormatException e) { 9 System.out.println(false); 10 } 11 } 12}

こんな感じになりました。
とても短くて見やすいと実感。
いかに自分がダメな事をしていたか。。。

ループの回し方にも問題がたくさんありましたが、
これらの点にもご指摘頂いた皆様、ありがとうございました。

一応これで解決済みにしたいと思います。
何か問題があれば解決済みですがコメント頂けるとありがたいです。

PS
numberという変数を出すだけだして使えていないのですが、これはしょうがないのでしょうか?
うまく纏める術を伝授して頂けると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

修正後のコードですが,数字を使うことが目的のコードではないので,numberを用意する必要が無いですね.
parseIntはint型の数値を返しますが,それを収める変数が無いだけで問題ありません.
もちろん変数を用意していても何ら問題ありません(Eclipseを使うと「変数numberの値は使われていません」と怒られますが).

投稿2015/04/21 10:12

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

R.lawliet

2015/04/21 10:37

なるほど、書かなくてよろしいのですね! スッキリしました。 ありがとうございます。
guest

0

lang

1 while (i < len){ 2 boolean result = Character.isDigit(ch); 3 if(i == len){ 4 System.out.println(true); 5 } else { 6 System.out.println(result); 7 break; 8 } 9 i++; 10 }

これだと今度は1文字目しかチェックできないのでは・・・・?
whileでi<lenという条件なので,iを操作せずに直後にあるi==lenという条件は絶対に成立しません.

投稿2015/04/21 09:35

編集2015/04/21 09:37
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

R.lawliet

2015/04/21 09:48

言われてみればそうですね、うぅん、頭の悪い自分がもどかしい。 i+1 == len サイレント修正で条件成立かな?と思うのですがこの場合の問題点はありますか? while (i < len){ boolean result = Character.isDigit(ch); if( i+1 == len){ System.out.println(true); } else { System.out.println(result); break; } i++; }
swordone

2015/04/21 10:06

1文字目でbreakされて抜けてしまうので話になりません. kutsulogさんのアルゴリズムをもう一度よく見て考えてください
R.lawliet

2015/04/21 10:39

回答ありがとう御座います。 for eachを使ってなかったですね、もうちょっと練りなおしてみます。
guest

0

このコード,本当はif文のtrueにはresultが入るべきなのでは?
たぶん自分の中で(resultがtrueなら・・・)ってお考えかと思いますが,
この書き方ではhtsignさんの言うとおり,最後のelse文に入り得ません(いわゆるデッドコード).

あなたの考え方に沿うなら,kutsulogさんの手法が一番自然ですが,
個人的にはipipip0129さんの手法を取りたいですね.
Integer#parseInt(String)は,引数が数値変換できなければNumberFormatExceptionを投げるので,
それをcatchした時falseとすれば要件は満たせます.

投稿2015/04/21 09:23

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

R.lawliet

2015/04/21 09:29

デッドコード確認致しました。 質問のコードを上書きしてみたので再度見て頂けるとありがたいです。 Integer#parseInt(String)の意見が多いので取り扱ってみようと思います。 ご丁寧にありがとうございます。
guest

0

ベストアンサー

受け取ったString文字列をparseIntして例外処理をすればいいんじゃない?
参考になればいいなと思います。

投稿2015/04/21 08:49

編集2015/04/21 08:54
ipipip0129

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

R.lawliet

2015/04/21 10:06

ループしか頭に無かった僕への打開策になりました。 感謝致します!
guest

0

問題文とは関係ないですが、

lang

1if (true) { 2} else { 3}

では絶対に elseが実行されないと思いますがそれはいいのですか?
&&演算子で true をつなげる意味も分かりません。

投稿2015/04/21 08:49

htsign

総合スコア870

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

R.lawliet

2015/04/21 09:06

まだまだ知識が足りないのでまともな人から見ると滅茶苦茶なコードになっている事と思います(汗) 1つずつ無駄なモノを省いて行こうと思います。 ちなみに、変なモノが一杯くっついているみたいですが、 現在の確認ではelseは動いております。 ご指摘ありがとうございます。
htsign

2015/04/21 09:21

そうなのですか、無粋なコメントだったようですね。 すみませんでした。
R.lawliet

2015/04/21 09:26

いえ、最終的には全部まともにしたいので質問とは別の問題点でもご指摘頂けるのはありがたいです。
guest

0

学校の課題のようなので考え方だけ書きます
1.for文を使って添え字を0から最後までループ(for-each形式を使ってもいいです)
2.ループの中ではisDigitがfalseの場合だけreturnして、trueを返すのはループを抜けた後
この辺が先生の言いたいところだと思います

(先生の想定を超えたいなら難易度が上がりますが「正規表現」を使う方法もあります。)

投稿2015/04/21 08:47

kutsulog

総合スコア985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

R.lawliet

2015/04/21 09:11

ご配慮ありがとうございます。 答えを教えてもらうのは卑怯だと思うので、ありがたいです。 最初の質問の時に書けば良かったのですが、 一文字ずつ見る方法ではないモノを使ってみてください、と言われました。 なのでkutsulogさんの提示して頂いた考え方は僕のコードの修正にはぴったりですが、 求められているものはちょっと違うのかもしれません。。。 正規表現、調べてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問