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

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

ただいまの
回答率

90.02%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 924

mnmtksk

score 11

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

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

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

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

public static void main(String[] args){
    Scanner scan = new Scanner(System.in);

    boolean condition = true;
    int numberPeg = 0;
    String [] orderPeg = null;
    int numberColour = 0;
    String[] nameColour=null;

    System.out.println("Enter the number of pegs.");
    try{
        while(condition){
            numberPeg = scan.nextInt();
            if(numberPeg<9){
                orderPeg = new String [numberPeg];
                condition=false;
            }
            else{System.err.println("Enter the number between 3-8.");}
        }
    }
    catch(InputMismatchException ime){System.err.println("Input valid argument.");}
    condition=true;

    System.out.println("Enter the number of colours.");
    try{
        while(condition){
            numberColour = scan.nextInt();
            if(numberColour<=numberPeg){
                nameColour = new String [numberColour];
                condition=false;
            }
            else{
                System.err.println("Enter appropriate number.");
            }
        }
    }
    catch(InputMismatchException ime){System.err.println("Input valid argument.");}
    condition=true;

    System.out.println("Enter colours.");
    try{
        try{
            int counter=0;
            while(counter<nameColour.length){
                String inputColour = scan.next();
                if(inputColour.equals("blue")||inputColour.equals("green")||inputColour.equals("orange")||inputColour.equals("purple")){
                    nameColour[counter]=inputColour;
                    counter++;
                }
                else{System.err.println("Colours must be blue, green, orange or purple.");}
            }
        }
        catch(NullPointerException npe){}
    }
    catch(InputMismatchException ime){System.err.println("Input valid argument.");}

    //ここが問題の箇所です
    System.out.println("Enter the colour of the order.");
    try{
        try{
            int counter=0;
            while(counter<numberPeg){
                String inputColour = scan.next();
//ここで比較する際に、nameColourの0番目の要素だけでなく、全ての要素と比較して、inputColourがnameColourに含まれているのか確かめたいです。
                if(inputColour.contains(nameColour[counter])){
                    orderPeg[counter]=inputColour;
                    counter++;
                }
                else{System.err.println("Must be the same colour you chose before.");}
            }
        }
        catch(NullPointerException npe){}
    }
    catch(InputMismatchException ime){System.err.println("Input valid argument.");}

    System.out.println("GAME START");
    System.out.println("The number of pegs are "+numberPeg);

}


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2015/12/22 00:48 編集

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

    キャンセル

回答 2

checkベストアンサー

+1

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

  • containsの使い方が変
    Stringオブジェクトに対してcontainsを使うと、その文字列に引数の文字列が含まれている場合にtrueを返します。例えば
"question".contains("tion");  //true


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

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


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


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

  • tryとwhileの囲みの関係を逆にして、whileループをbreakで抜けるようにする
    今のままだと不正な入力をした場合にループを抜けてしまい、間違ったまま処理をする事になります。
    なのでwhileループ内で例外処理してループを続行させるようにします。
    whileにはtrueを渡してbreakで抜けるようにすればconditionという変数も不要になります。
while(true) {
    try {
        numberPeg = scan.nextInt();
        if(numberPeg >= 3 && numberPeg <= 8){  //ここも修正
            orderPeg = new String [numberPeg];
            break;
        } else {System.err.println("Enter the number between 3-8.");}
    } catch(InputMismatchException ime){
        //不正な入力はループ内で処理してループ継続
        System.err.println("Input valid argument.");
    }
}
  • catchは一つのtryブロックに対していくつも書ける
  • 語順入れ替えでNullPointerチェックは不要になる
try{
    int counter=0;
    while(counter<nameColour.length){
        String inputColour = scan.next();
        if(inputColour.equals("blue")||inputColour.equals("green")||inputColour.equals("orange")||inputColour.equals("purple")){
            nameColour[counter]=inputColour;
            counter++;
        }
        else{System.err.println("Colours must be blue, green, orange or purple.");}
    }
}
catch(NullPointerException npe){}
catch(InputMismatchException ime){System.err.println("Input valid argument.");}


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

"blue".equals(inputColour)


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

  • 配列の各要素とチェックしたいならループ処理
    本題ですが、ご自分でも書いていらっしゃるように、現状では配列の一つの要素としか比較していません。
    ループ処理で各要素と比較する必要があります。
boolean match = false;
for(String colour : nameColour){
    if(colour.equals(inputColour){
        //処理
        match = true;
    }
}
if(!match){/* なかった場合の処理 */}


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/22 01:46

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

    キャンセル

  • 2015/12/22 10:51

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

    キャンセル

  • 2015/12/22 11:58

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/22 01:52

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

    キャンセル

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

  • ただいまの回答率 90.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る