数组等于忽略顺序

时间:2012-08-17 16:13:40

标签: java arrays equals

  

可能重复:
  Java: Checking equality of arrays (order doesnt matter)

我有两个数组:

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 个答案:

答案 0 :(得分:23)

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

(感谢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

答案 1 :(得分:22)

我认为它可能适合你,用

排序第一个数组
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);

答案 2 :(得分:8)

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

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

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

答案 3 :(得分:1)

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