2

重複の可能性:
Java で文字列を比較するにはどうすればよいですか?

Java の switch ステートメントの使用方法がわかりません。case ステートメントの 1 つでメソッドを実行した後も、default ステートメントに移動し、それも実行します。コードは次のとおりです。

Scanner scanner = new Scanner(System.in);
String option = null;

while (option != "5") {
    ShowMenu();
    option = scanner.nextLine();
    switch (option) {
        case "1": ViewAllProducts(); break;
        case "2": ViewProductDetails(scanner); break;
        case "3": DeleteProduct(scanner); break;
        case "4": AddProduct(scanner); break;
        case "5": break;
        default: System.out.println("Invalid option. Please try again."); break;
    }
}

上記のコードは main メソッドにあります。たとえば、ケース「4」を実行した後、「無効なオプション」が出力されます。

4

6 に答える 6

7
  while (!option.equals("5")){...}

.equals()文字列比較に使用します。

==文字列参照の比較 (メモリ位置) .equals()文字列値の比較

于 2012-09-22T08:59:08.857 に答える
6

==while 条件 (値の代わりに参照を比較 -値の等価性にはメソッドを使用equals) で文字列を比較していますが、while ループは次のように変更する必要があります -

while (!option.equals("5"))

Javaでは演算子のオーバーロードが許可されていませんが、演算子のオーバーロードにより、C#では問題なく動作します(ただし、「+」は文字列と数値に対してオーバーロードされます)。

于 2012-09-22T08:58:08.137 に答える
1

新しいオプションを読み取る前に、スキャナー参照を再初期化するようにコードを変更しています。

    Scanner scanner = new Scanner(System.in);
    String option = null;

    ShowMenu();
    option = scanner.nextLine();

    while (!"5".equals(option)) {
        switch (option) {
            case "1": ViewAllProducts(); break;
            case "2": ViewProductDetails(scanner); break;
            case "3": DeleteProduct(scanner); break;
            case "4": AddProduct(scanner); break;
            case "5": break;
            default: System.out.println("Invalid option. Please try again..."); break;
        }
        ShowMenu();
        scanner = new Scanner(System.in);  // Add this here

        option = scanner.nextLine();    // Use brand new scanner without any problem..
    }

残りは、私が提供したリンクから読んで、ユーザー入力を読み取るためのさまざまな方法の違いを知ることができます。

于 2012-09-23T01:20:28.680 に答える
1

問題はwhileループの状態だと思います。条件を変更しwhile(!"5".equals(option))て、問題を実行してみてください。

これがお役に立てば幸いです。

于 2012-09-22T09:10:14.097 に答える
1

あなたの scanner. nextLine() はあなたの外にあるはずです。そして、一般的に、do-while は switch-case と組み合わせて使用​​する方が適しています..

ユーザーから読み取る場合、switch-case を使用した do-while の一般的な使用法は次のとおりです。

boolean flag = false;
do {
    String option = scanner.nextLine();
    switch (option) {
        case "1": break;
        case "2": break;
        default : flag = true;
                  break;
    }
} while(! flag);

知っておくべき重要なことの 1 つは、次のとおりです。 - Java では文字列は不変です。

一般に、Java での文字列比較では、値を比較する場合は equals() 関数を使用する必要があります。また、クラスでこの equals() および hashcode() メソッドをオーバーライドすることをお勧めします (将来的に作成する場合)。 )、クラスの 2 つのインスタンスを比較します。

実際、== と equals() には大きな違いがあります。実際には、文字列の作成方法によって異なります。たとえば、これがコードであるとします: -

String a = "5"; 
String b = new String("5");
String c = "5"; or String c = a;

System.out.println("a == b?" + (a == b));  // Will Print false
System.out.println("a.equals(b)?" + a.equals(b));   // Will Print true..

System.out.println("a == c?" + (a == c));  // Will Print true
System.out.println("a.equals(c)?" + a.equals(c));   // Will Print true..

上記のコードでは、文字列参照 'a' と 'c' は、"5" で表される同じオブジェクトを指しています。参照 "b" は別のオブジェクト "5" を指していますが、"new" 演算子を使用して文字列を作成すると、常に新しいオブジェクトが作成されるためです。

ここで、== 演算子は、比較される 2 つの String 参照が同じオブジェクトを指しているか異なるオブジェクトを指しているかをチェックしますが、equals()関数は、2 つの文字列オブジェクトに含まれる実際の値を比較します。

これで、プログラムの出力が明確になります。これについて説明したのは、while で equals() 関数を使用して、「オプション」参照が「5」と同じ値であるかどうかを確認する必要があるためです。

さて、コードを少し変更して、できれば do-while を使用して必要な出力を取得できると思います..

于 2012-09-22T11:26:37.117 に答える
0

各関数にスキャナーを渡すのをやめ、代わりに各関数内に新しいスキャナーを作成しました。これで問題は解決しました。それで、私はその問題を理解しました..しかし、私はその理由を知りたいです..

SSCE を投稿した場合は、おそらくそれに答えることができます。残念ながら、あなたが説明している動作には、あなたが示していないコードが含まれています。

これはJavaのバグですか、それとも正常ですか?

これがJava のバグである可能性はほとんどありません。Scannerコードは Java で数年間使用されており、重大なバグは以前に発生して修正されている可能性があります。

一方、Scannerメソッドに a を渡すこと自体が違いを生む理由は思いつきません。

しかし、肝心なのは、SSCE がなければ、コードが実際に何をしているのかを把握することは不可能であり、根本的な原因を説明することはできないということです。

これが問題である理由を理解できれば、将来他のクラスでも回避できます..これがスキャナーでのみ発生しない限り?

SSCE がなければ、理解を助けることはできません。

于 2012-09-23T01:39:44.750 に答える