数组等于忽略顺序

可能重复:
Java:检查数组的相等性(顺序无关紧要)

我有两个数组:

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

我需要检查两者是否包含相同的元素(和相同的长度), 而不管元素的顺序如何

我尝试了Arrays.equals(a1, a2)但它考虑了元素的顺序。 org.apache.commons.lang.ArrayUtils不提供这个东西。

我知道我可以通过创建自己的方法(检查相同的长度,然后对两个数组进行排序然后使用Arrays.equals(a1, a2) )来实现相同的目的Arrays.equals(a1, a2)但是想知道这个东西是否在任何API中提供或者还有更多聪明的方式做同样的事情。

如果在从Collectioninheritance的内容中包含这些数组,则可以使用Collection接口中的collection.containsAll( otherCollection ) 。 但是,您还需要比较两者的长度,以validation一组不是另一组的超集。

(感谢Aardvarkk和piegames。)

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

注意:这将达到一定程度。 这被定义为检查存在的任何元素中的至少一个 。 也就是说,如果一个集合中有3 a值,而另一个集合中有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 

我认为它可能适合你,排序第一arrays

 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); 

在比较之前将列表转换为集合:

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

或者,您可以使用Arrays.sort()对数组进行Arrays.sort()但这可能会破坏依赖于数组中元素顺序的代码。

使用java.util.Set方法equals 。 比较两个具有相同大小的集合,并且指定集合的​​每个成员都包含在其他集合中。