2012-09-07 21 views
6

私は2つのList<String[]>(文字列配列リスト)を持っています。私はお互いの内容を一致させたいと思います。明らかに==はトリックはしませんが、.equals()はどちらかと思われません。では、文字列配列リストの内容が同じかどうかをどうすれば確認できますか?比較リスト<String[]>

ところで、上記の両方のケースで私はメッセージnullで例外が発生しました。

編集: Ok ...何らかの理由でx.equals(y)が動作し、y.equals(x)ではありません。奇数...

+0

試したことのコードスニペットを提供できますか? – kosa

+0

"何らかの理由でx.equals(y)のみが動作し、** y.equals(x)**は使用できません。私は 'y'が' null'だと信じています。初期化しますか? – Sam

+0

+私は 'public class MainActivity extends Activity {'の直後にします。 – RobinJ

答えて

0

ちょうど.equals()はうまく動作しますが、何らかの形で一方向にしか動作しません。

私はこの質問の最初の答えを受け入れようとしていましたが、明らかにその人は彼の答えを取り除きました。

+0

一方向に動作する場合は動作しません。あなたはここにバグを作成しています。 @Paul Belloraと私の答えはどちらも良い –

5

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

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

あなたは簡単にArrays.asListを使用してAbstractListを拡張し、薄いList<String>実装でString[]をラップすることができます。

EDIT:ここでは例です:

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 
+0

@Downvoter - コメントしますか? –

3

通常あなたは配列を扱う避けるべきです。彼らは醜いので、この種の問題につながります。可能であればList<List<String>>を使用すると、通常.equals()を使用できます。

あなたが主張するのであれば、以下のようなカスタムイコール・インプリメンテーションを使用できます。キーはあなたがComparableインタフェースを使用することができます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(); 
    } 
} 
0

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

-1

(Guavaを使用して)how to convert a List to a StringのJon Skeetの回答を使用すると、2つのリストを2つの文字列に変換してからequalsを使用して比較することもできます。ルーピングなし。