【问题标题】:Arrays Equals Ignoring Order [duplicate]数组等于忽略顺序[重复]
【发布时间】:2012-08-17 16:13:40
【问题描述】:

可能重复:
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 中提供或者有更聪明的方法做同样的事情。

【问题讨论】:

  • 你试过Arrays.sort(a2),然后检查它们是否相等?
  • 您可以在调用 Arrays.equals 之前对数组进行排序,但这会很昂贵。
  • 一个可能更有效的解决方案是将第一个数组的项添加到哈希集中,然后检查第二个数组的哪些项在哈希集中。

标签: java arrays equals


【解决方案1】:

如果你在继承自 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

【讨论】:

  • 您不需要双向检查 containsAll 吗?对于作为另一个超集的集合,单向评估将返回 true,这似乎不是 OP 想要的。
  • @aardvarkk 好点!我会编辑我的帖子。
  • 这不能正确处理重复。 JavaDoc 没有明确说明这一点,但a.containsAll(b) iff a 对于b 中的每个元素x 包含至少一个 x。例如,尝试使用a={5}b={5,5} 进行测试。当被视为多重集时,它们不相等,但containsAll 在两个方向上都返回true
  • 至少这是在实践中使用的containsAll的解释。甚至 Guava 的Multiset.containsAll“也没有考虑元素的出现次数”。
  • @aardvarkk 只检查两个数组的长度而不是第二个 containsAll 的长度不够吗? (假设没有重复)
【解决方案2】:

我认为它可能对你有用,用

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

【讨论】:

  • 排序应该发生在 a1 和 a2 上。不能保证 a1 已经排序。
  • 即便如此,排序并不总是一个好主意:它会改变数据。如果您不想要它,则必须复制需要时间和内存的数据。
  • 如果对象没有实现可比较,这将不起作用
【解决方案3】:

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

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

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

【讨论】:

  • 只有在没有重复的情况下才有效。
  • 这也更有效,因为它运行 O(m+n) 而在列表上执行 containsAll 是 O(n^2+m^2)
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2013-03-21
    • 2020-03-11
    • 1970-01-01
    • 2012-10-03
    • 2022-01-25
    • 2012-05-31
    • 2020-06-21
    • 2020-02-18
    相关资源
    最近更新 更多