数组等于忽略顺序

Ani*_*dia 28 java arrays equals

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

我有两个数组:

String[] a1 = {"a", "b", "c"};
String[] a2 = {"c", "b", "a"};
Run Code Online (Sandbox Code Playgroud)

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

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

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

Bla*_*ble 24

如果这些数组包含在继承自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
Run Code Online (Sandbox Code Playgroud)

  • 你不需要在两个方向检查containsAll吗?对于作为另一个超集的集合,单向评估将返回true,这似乎不是OP想要的. (4认同)
  • 这不能正确处理重复.JavaDoc并没有明确这一点,但是`a.containsAll(b)`iff`a`在`b`中为每个元素`x`包含**至少一个**`x`.例如,尝试使用`a = {5}`,`b = {5,5}`进行测试.当被视为多重集时,它们不相等,但`containsAll`在两个方向上都返回`true`. (3认同)
  • @aardvarkk仅仅检查两个数组的长度而不是检查第二个containsAll的长度还不够吗?(假设没有重复项) (2认同)

sat*_*ngh 23

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

Arrays.sort(Object[]);
Run Code Online (Sandbox Code Playgroud)

之后你就可以比较了

Arrays.equals(Object[],Object[]);
Run Code Online (Sandbox Code Playgroud)

完整的代码是:

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

boolean result= Arrays.equals(a1, a2);
Run Code Online (Sandbox Code Playgroud)

  • 排序应该在a1和a2上进行.无法保证a1已经排序. (2认同)

Aar*_*lla 10

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

new HashSet( Arrays.asList( a1 )).equals( new HashSet( Arrays.asList( a2 ) ));
Run Code Online (Sandbox Code Playgroud)

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

  • 只有在没有重复的情况下才有效. (13认同)
  • 这也更有效,因为它运行O(m + n)而在列表上执行containsAll是O(n ^ 2 + m ^ 2) (2认同)