比较两个顺序不同的数组
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.
但是,如果您不想使用另一种类型,我建议您实现自己的函数来检查每个元素是否存在于另一个元素中。
希望对您有所帮助!
我可以想到两种方法:
- 检查它们的大小是否相等
- 用
Arrays.asList()
包裹两个数组
- 检查
a
是否包含 b
中的所有元素
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)
或者,如果它们不能重复,请按照
的建议使用集合
我是编码新手,我决定学习 java、groovy。我正在做一个简单的练习。我有两个数组,如果它们相等,我必须比较它们。我从 2 个数据库中获取值,这些数据库相同,但值的顺序不同,但它们是相等的。例如,我有:
ArrayList collection1 = ["test","a"]
ArrayList collection2 = ["a","test"]
好吧,我试过了:
assert collection1.equals(collection2)
但我知道只有当这些数组中的值按相同顺序放置时才有效。
在数组中,顺序很重要。如果你想要一个数组而不检查顺序,你应该使用 Sets Sets tutorial.
但是,如果您不想使用另一种类型,我建议您实现自己的函数来检查每个元素是否存在于另一个元素中。
希望对您有所帮助!
我可以想到两种方法:
- 检查它们的大小是否相等
- 用
Arrays.asList()
包裹两个数组
- 检查
a
是否包含b
中的所有元素
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)
或者,如果它们不能重复,请按照