1

何が間違っているのかわかりません。アイテムのリストが 2 つあり、両方を比較しようとしています。

private static void check_results(ArrayList<int[]> result2, int[] reversedList) {
    //check results list for matches
    System.out.println();
    for (int[] item : result2) {
        System.out.println(Arrays.toString(item) + " compared to " + Arrays.toString(reversedList));
        if ( Arrays.toString(item) == Arrays.toString(reversedList)) 
        {   
            System.out.println("we have a match!");
        }
    }

}

しかし、私は決して一致していないようです。視覚的に比較すると、それらが一致していることがわかります。

[0, 0, 0, 20] compared to [0, 0, 0, 20]
... and so on

私は何を間違っていますか?私はArrayListとして始まることを知っていますが、それは私の変数と同じresult2だと思って繰り返しますが、一致することはありません。int[]reversedList

4

3 に答える 3

4

equals()onString (ここで正確な定義を参照) を使用し、値ではなく参照(つまり、メモリ内のまったく同じオブジェクトを指している 2 つの参照) で==比較します(メモリ内に同じコンテンツを持つ複数の文字列インスタンスがある場合があります) 。 .

必要なものはこれです:

if ( Arrays.toString(item).equals( Arrays.toString(reversedList) )) { ... }

文字列が最適化されているかどうかはわかりません (JLS によって定義されている場合もあります。たとえば、2 つの文字列が同じコンパイル単位で定義されていて、それらの値が追加のコンパイルなしでまったく同じである場合など)。 -時間検証、それらは同じ参照を使用しますが、たとえば"ab"andを使用する"a" + "b"と、OS、JVM バージョン、ビルド番号、宇宙の現在の状態などに基づいて、同じまたは異なる参照になる可能性があります)。

追加の注意事項については、こちらまたはこちらをご覧ください。

于 2012-05-26T18:55:25.650 に答える
2

オブジェクト (文字列) を比較==して、それらがまったく同じオブジェクトであることを確認します。別の言い方をすれば、メモリ内の同じ場所を参照するということです。.equals()代わりにメソッドを使用します。

于 2012-05-26T18:55:52.140 に答える
2

意味のある比較の使用またはメソッドのために ( ) オブジェクトの参照を比較するものと比較Stringしないでください。==StringequalsequalsIgnoreCase

それ以外の

if ( Arrays.toString(item) == Arrays.toString(reversedList)) 

これを使って :

if (Arrays.toString(item).equals(Arrays.toString(reversedList)))

または大文字と小文字を区別しない比較が必要な場合はこれ

if (Arrays.toString(item).equalsIgnoreCase(Arrays.toString(reversedList))) 
于 2012-05-26T18:56:38.473 に答える