6

's(文字列配列リスト)が2つあるのですがList<String[]>、内容を合わせたいです。明らか==にトリックはしませんが、.equals ()そうでもないようです。では、文字列配列リストの内容が同じかどうかを確認するにはどうすればよいでしょうか?

ところで、上記の両方のケースで、 message で例外が発生しましたnull

編集:わかりました...何らかの理由でのみx.equals(y)機能し、機能しませんy.equals(x)。奇数...

4

5 に答える 5

5

おそらく最も簡単な解決策は、List<List<String>>代わりに 2 つの を使用することです。List使用される実装が extendsであると仮定すると、AbstractList使用するequalsと目的の動作が得られます。のドキュメントからAbstractList.equals:

指定されたオブジェクトがこのリストと等しいかどうかを比較します。true指定されたオブジェクトもリストであり、両方のリストが同じサイズであり、2 つのリスト内の対応する要素のすべてのペアが等しい場合にのみ を返します 。(2 つの要素e1e2は、 の場合に等しいです(e1==null ? e2==null : e1.equals(e2))。) つまり、2 つのリストは、同じ要素が同じ順序で含まれている場合に等しいと定義されます。

を使用して拡張String[]する薄い実装でを簡単にラップできます。List<String>AbstractListArrays.asList

編集:ここに例があります:

String[] array1 = {"1", "2", "3"};
String[] array2 = {"4", "7"};

String[] array3 = {"1", "2", "3"};
String[] array4 = {"4", "7"};

List<List<String>> lst1 = new ArrayList<>();
lst1.add(Arrays.asList(array1));
lst1.add(Arrays.asList(array2));

List<List<String>> lst2 = new ArrayList<>();
lst2.add(Arrays.asList(array3));
lst2.add(Arrays.asList(array4));

System.out.println(lst1.equals(lst2)); //prints true
于 2012-09-07T18:35:27.907 に答える
3

通常、配列を扱うことは避けるべきです。それらは醜く、この種の問題につながります。使えれば普通List<List<String>>に使えます。.equals()

あなたが主張する場合は、以下のようなカスタム isequal 実装を使用できます。鍵は使用することですArrays.equals()

public class DemoEquals {
    List<String[]> listOne = (List<String[]>) Arrays.asList(new String[]{"one1", "one2"}, new String[]{"two1"});
    List<String[]> listOneOne = (List<String[]>) Arrays.asList(new String[]{"one1", "one2"}, new String[]{"two1"});
    List<String[]> listTwo = (List<String[]>) Arrays.asList(new String[]{"2one1", "2one2"}, new String[]{"2two1"});

    private boolean isEqual(List<String[]> list1, List<String[]> list2) {
        if (list1.size() != list2.size()) return false;
        for (int i = 0; i < list1.size(); i++) {
            if (!Arrays.equals(list1.get(i), list2.get(i))) return false;
        }
        return true;
    }
    @SuppressWarnings("unchecked")
    private void isEqual() {
        //prints true
        System.out.println(isEqual(Collections.EMPTY_LIST, Collections.EMPTY_LIST));
        //prints true
        System.out.println(isEqual(listOne, listOne));
        //prints true
        System.out.println(isEqual(listOne, listOneOne));
        //prints false
        System.out.println(isEqual(listOne, listTwo));
        //prints false
        System.out.println(isEqual(listOne, Collections.EMPTY_LIST));

    }
    public static void main(String[] args) {
        new DemoEquals().isEqual();
    }
}
于 2012-09-07T18:36:19.193 に答える
0

INTERFACE Comparable を使用できます。必要なメソッドを実装すると、List1.compare(List2) 関数を使用できます。

于 2012-09-07T18:39:36.947 に答える
0

うまく.equals()機能しますが、どういうわけか一方向にしか機能しません。

私はこの質問に対する最初の回答を受け入れるつもりでしたが、どうやら男は回答を削除したようです。

于 2012-09-09T10:24:50.620 に答える
-1

リストを文字列に変換する方法(Guavaを使用)に関するJon Skeetの回答を使用すると、2つのリストを2つの文字列に変換し、 equals. ループなし。

于 2012-09-07T18:39:53.527 に答える