比较两个顺序不同的数组

Compare two arrays with not the same order

我是编码新手,我决定学习 java、groovy。我正在做一个简单的练习。我有两个数组,如果它们相等,我必须比较它们。我从 2 个数据库中获取值,这些数据库相同,但值的顺序不同,但它们是相等的。例如,我有:

ArrayList collection1 = ["test","a"]
ArrayList collection2 = ["a","test"]

好吧,我试过了:

assert collection1.equals(collection2)

但我知道只有当这些数组中的值按相同顺序放置时才有效。

在数组中,顺序很重要。如果你想要一个数组而不检查顺序,你应该使用 Sets Sets tutorial.

但是,如果您不想使用另一种类型,我建议您实现自己的函数来检查每个元素是否存在于另一个元素中。

希望对您有所帮助!

我可以想到两种方法:

  1. 检查它们的大小是否相等
  2. Arrays.asList()
  3. 包裹两个数组
  4. 检查 a 是否包含 b
  5. 中的所有元素
public static boolean equals(Object[] a, Object[] b) {
    return a.length == b.length && Array.asList(a).containsAll(Arrays.asList(b));
}

另一种方法是同时遍历两个数组,然后检查元素是否相等:

public static boolean equals(Object[] a, Object[] b) {
    if(a.length != b.length) return false;
    outer: for(Object aObject : a) {
         for(Object bObject : b) {
              if(a.equals(b)) continue outer;
         }
         return false;
    }
    return true;
}

这两种方法都相当快,第一种方法在数组周围引入了一个额外的包装器,但可以忽略不计,因为 Arrays.asList() 只是将给定的数组用作视图而不进行任何额外的复制。


现在看来你实际上是在比较两个Collection,那么你可以使用这种方法:

public static boolean equals(Collection<?> a, Collection<?> b) {
     return a.size() == b.size() && a.containsAll(b);
}

我对 Java 编程一无所知,但我已经更广泛地考虑这个问题一段时间了,我认为我有一个可行的解决方案,如果你知道 a先验数组中可以包含的所有值。

如果您为数组中可能出现的每个字符串分配一个素数,然后将数组的所有元素相乘,则相乘后的数字将代表一个唯一的组合,但不是顺序,或阵列。要关闭循环,您只需比较该乘法的值。如果有更好的答案,请使用它,但我想我会分享这个想法。

在Groovy中,只需对它们进行排序,并检查排序后的列表:

assert listA.sort(false) == listB.sort(false)

或者,如果它们不能重复,请按照

的建议使用集合