37

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

我有两个数组:

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 接口中使用。但是,您还需要比较两者的长度,以验证一组不是另一组的超集。

(感谢 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
于 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。比较两个具有相同大小的集合,并且指定集合的​​每个成员都包含在另一个集合中。

于 2012-08-17T16:23:18.173 回答