37

重複の可能性:
Java: 配列の等価性のチェック (順序は関係ありません)

私は2つの配列を持っています:

String[] a1 = {"a", "b", "c"};
String[] a2 = {"c", "b", "a"};

要素の順序に関係なく、両方に同じ要素 (および同じ長さ) が含まれているかどうかを確認する必要があります。

試しArrays.equals(a1, a2)てみましたが、要素の順序を考慮しています。 org.apache.commons.lang.ArrayUtilsこのことを提供しません。

私は自分のメソッドを作成することで同じことを達成できることを知っています(同じ長さをチェックし、両方の配列をソートしてから使用しArrays.equals(a1, a2)ます)が、これがAPIで提供されているかどうか、または同じことを行うためのよりスマートな方法があるかどうかを知りたい.

4

4 に答える 4

33

Collection から継承したものにこれらの配列がある場合はcollection.containsAll( otherCollection )、 Collection インターフェイスから使用できます。ただし、2 つのセットの長さを比較して、一方のセットが他方のスーパーセットではないことを確認する必要もあります。

(Aardvarkk と piegames に感謝します。)

http://docs.oracle.com/javase/6/docs/api/java/util/Collection.html#containsAll(java.util.Collection)

注: これはある程度まで機能します。これは、存在する要素の少なくとも 1 つをチェックするように定義されています。つまり、1 つのコレクションに 3 つaの値があり、もう 1 つのコレクションに 7 つの値がある場合、必ずしもそれらが等しくないと見なされるわけaではありません。

例:

[a, b, c] == [c, a, b]             // Works -- Mixed order
[a, b, c, d, d] == [a, b, d, c, d] // Works -- Mixed order with repeats
[a, b, c, d, d] == [a, b, b, c, d] // FAILS -- Different repeats
[a, b, c, d, d] != [a, b, c, d]    // Works -- Length differs with repeats
[a, b, c, d] != [a, b, c]          // Works -- Length differs
[a, b, d] != [a, b, c]             // Works -- Disjoint sets
于 2012-08-17T16:19:40.583 に答える
27

私はそれがあなたのために働くかもしれないと思う、最初の配列を

Arrays.sort(Object[]);

その後、あなたはと比較することができます

Arrays.equals(Object[],Object[]);

完全なコードは次のとおりです。

String[] a1 = {"a", "b", "c"};
String[] a2 = {"c", "b", "a"};
Arrays.sort(a2);

boolean result= Arrays.equals(a1, a2);
于 2012-08-18T05:45:55.393 に答える
14

それらを比較する前に、リストをセットに変換します。

new HashSet( Arrays.asList( a1 )).equals( new HashSet( Arrays.asList( a2 ) ));

または、 を使用して配列を並べ替えることができますが、配列Arrays.sort()内の要素の順序に依存するコードが壊れる可能性があります。

于 2012-08-17T16:18:46.853 に答える
2

java.util.Setメソッドを使用しequalsます。同じサイズの2つのセットを比較し、指定されたセットのすべてのメンバーが他のセットに含まれます。

于 2012-08-17T16:23:18.173 に答える