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

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

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

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

Q&A

解決済

2回答

2279閲覧

User inputとString[]の要素を比較したい

mnmtksk

総合スコア13

Java

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

0グッド

0クリップ

投稿2015/12/21 15:45

編集2015/12/21 16:08

Javaでマスターマインドを作成しているプログラミング初心者です。

Userからのinputを取得し、作成済みのString[]の全ての要素と比較したいです。

今考えているのが
①String[] にn個要素が入っている
②User inputを取得(inputの取得にはscannerを使用)
③inputとString[]のn個の要素と比較
④inputが要素のどれか1つとでも一致していれば新しい別のString[]に格納、どれとも一致しなければ警告メッセージを表示
②から④を一定回数繰り返す。
というプロセスなのですが、コードを書いてみても思う結果が得られません。

以下そのコードです。作成段階なので完成していません。

Java

1public static void main(String[] args){ 2 Scanner scan = new Scanner(System.in); 3 4 boolean condition = true; 5 int numberPeg = 0; 6 String [] orderPeg = null; 7 int numberColour = 0; 8 String[] nameColour=null; 9 10 System.out.println("Enter the number of pegs."); 11 try{ 12 while(condition){ 13 numberPeg = scan.nextInt(); 14 if(numberPeg<9){ 15 orderPeg = new String [numberPeg]; 16 condition=false; 17 } 18 else{System.err.println("Enter the number between 3-8.");} 19 } 20 } 21 catch(InputMismatchException ime){System.err.println("Input valid argument.");} 22 condition=true; 23 24 System.out.println("Enter the number of colours."); 25 try{ 26 while(condition){ 27 numberColour = scan.nextInt(); 28 if(numberColour<=numberPeg){ 29 nameColour = new String [numberColour]; 30 condition=false; 31 } 32 else{ 33 System.err.println("Enter appropriate number."); 34 } 35 } 36 } 37 catch(InputMismatchException ime){System.err.println("Input valid argument.");} 38 condition=true; 39 40 System.out.println("Enter colours."); 41 try{ 42 try{ 43 int counter=0; 44 while(counter<nameColour.length){ 45 String inputColour = scan.next(); 46 if(inputColour.equals("blue")||inputColour.equals("green")||inputColour.equals("orange")||inputColour.equals("purple")){ 47 nameColour[counter]=inputColour; 48 counter++; 49 } 50 else{System.err.println("Colours must be blue, green, orange or purple.");} 51 } 52 } 53 catch(NullPointerException npe){} 54 } 55 catch(InputMismatchException ime){System.err.println("Input valid argument.");} 56 57 //ここが問題の箇所です 58 System.out.println("Enter the colour of the order."); 59 try{ 60 try{ 61 int counter=0; 62 while(counter<numberPeg){ 63 String inputColour = scan.next(); 64//ここで比較する際に、nameColourの0番目の要素だけでなく、全ての要素と比較して、inputColourがnameColourに含まれているのか確かめたいです。 65 if(inputColour.contains(nameColour[counter])){ 66 orderPeg[counter]=inputColour; 67 counter++; 68 } 69 else{System.err.println("Must be the same colour you chose before.");} 70 } 71 } 72 catch(NullPointerException npe){} 73 } 74 catch(InputMismatchException ime){System.err.println("Input valid argument.");} 75 76 System.out.println("GAME START"); 77 System.out.println("The number of pegs are "+numberPeg); 78 79}

このコードでは、inputColourがnameColourと全く同じでなければ、警告メッセージがプリントされました。
アドバイスをお願いします。

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

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

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

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

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

swordone

2015/12/21 15:49 編集

このコードに警告メッセージはないようですが…どのような警告メッセージが表示されたのでしょうか?それと、それぞれの変数が何を指しているのかちょっとわからないのでもう少し説明を加えたり、コード全体を見せてもらったりして欲しいです。
guest

回答2

0

ベストアンサー

とりあえず今のところ変な部分を挙げていくと…

  • containsの使い方が変

Stringオブジェクトに対してcontainsを使うと、その文字列に引数の文字列が含まれている場合にtrueを返します。例えば

java

1"question".contains("tion"); //true

こうなります。おそらく質問者様のイメージとしては

java

1List<String> list = Arrays.asList(existingString); 2if(list.contains(input)){ /* listにinputと一致するものが存在する場合の処理 */ }

こうなるのではないでしょうか?


せっかくコードを載せてくれたので、いくつか指摘したいと思います。

  • tryとwhileの囲みの関係を逆にして、whileループをbreakで抜けるようにする

今のままだと不正な入力をした場合にループを抜けてしまい、間違ったまま処理をする事になります。
なのでwhileループ内で例外処理してループを続行させるようにします。
whileにはtrueを渡してbreakで抜けるようにすればconditionという変数も不要になります。

java

1while(true) { 2 try { 3 numberPeg = scan.nextInt(); 4 if(numberPeg >= 3 && numberPeg <= 8){ //ここも修正 5 orderPeg = new String [numberPeg]; 6 break; 7 } else {System.err.println("Enter the number between 3-8.");} 8 } catch(InputMismatchException ime){ 9 //不正な入力はループ内で処理してループ継続 10 System.err.println("Input valid argument."); 11 } 12}
  • catchは一つのtryブロックに対していくつも書ける
  • 語順入れ替えでNullPointerチェックは不要になる

java

1try{ 2 int counter=0; 3 while(counter<nameColour.length){ 4 String inputColour = scan.next(); 5 if(inputColour.equals("blue")||inputColour.equals("green")||inputColour.equals("orange")||inputColour.equals("purple")){ 6 nameColour[counter]=inputColour; 7 counter++; 8 } 9 else{System.err.println("Colours must be blue, green, orange or purple.");} 10 } 11} 12catch(NullPointerException npe){} 13catch(InputMismatchException ime){System.err.println("Input valid argument.");}

tryのネストを一つ外してこれでも機能します。
しかし先ほどの通りここもwhileとtryを逆にすべきです。
そしてNullPointerExceptionの心配は、おそらくinputolourとの比較の場面だと思われるのですが、

java

1"blue".equals(inputColour)

のようにすればその心配はありません(nullならfalseが返ってくるだけ)。
これも色の名前をList化してcontainsチェックのほうが楽に書けそうですが。

  • 配列の各要素とチェックしたいならループ処理

本題ですが、ご自分でも書いていらっしゃるように、現状では配列の一つの要素としか比較していません。
ループ処理で各要素と比較する必要があります。

java

1boolean match = false; 2for(String colour : nameColour){ 3 if(colour.equals(inputColour){ 4 //処理 5 match = true; 6 } 7} 8if(!match){/* なかった場合の処理 */}

最初の私の回答のようにList化すればループせずにcontainsで解決しますが。

投稿2015/12/21 16:02

編集2015/12/21 16:36
swordone

総合スコア20649

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

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

mnmtksk

2015/12/21 16:46

とても丁寧に解説してくださりありがとうございました。ご指摘の通り、Listを使用してみたところ、自分の思う結果を得ることができました。
mnmtksk

2015/12/22 01:51

ここに投稿するべきではないのかもしれませんが。。 不正入力(アルファベット)した場合、while(true)の中のcatch節で、手動でterminateしない限り警告メッセージが無限に出てきてしまう状態なのですが、何か解決方法はあるでしょうか。正しい入力がなされるまでは引き続きループ処理も行いたいのですが。
mnmtksk

2015/12/22 02:58

上記の問題ですが、 scan.next(); を使用し解決いたしました。
guest

0

input.contains(existingString[counter])ですが、
この文の意味は、「inputexistingString[counter]を含んでいるかどうか」なので、
想定されている処理とは逆になっているのではないでしょうか。

あと、「③inputとString[]のn個の要素と比較」のところは、existingString[counter]の個数分だけ処理を繰り返す必要があると思います。

投稿2015/12/21 15:59

argius

総合スコア9388

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

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

mnmtksk

2015/12/21 16:52

argiusさんの仰る通り、自分が想定していたことと逆のコードを書いていたようです。あとはswordoneさんの回答にあったListを使用する方法で解決できました。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問