我是编码方面的新手,因此决定学习groovy。我正在做一个简单的练习。我得到了两个数组,如果它们相等,则必须比较它们。我从2个数据库中获取值,这些数据库是相同的,但是值的顺序不同,但是它们相等。例如,我有:
ArrayList collection1 = ["test","a"]
ArrayList collection2 = ["a","test"]
好吧,我尝试过:
assert collection1.equals(collection2)
但是我知道只有当这些数组中的值以相同顺序放置时,这种方法才有效。
答案 0 :(得分:3)
我可以想到两种方法:
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()
仅将给定的数组用作View,并且不执行任何其他复制操作。
现在看来,您实际上是在比较两个Collection
,然后可以使用这种方法:
public static boolean equals(Collection<?> a, Collection<?> b) {
return a.size() == b.size() && a.containsAll(b);
}
答案 1 :(得分:0)
答案 2 :(得分:0)
我对Java编程绝对了解,但是一段时间以来,我已经更普遍地想到了这个问题,而且我认为我有一个可行的解决方案,如果您知道所有先验知识,便可以推广。可以包含在数组中。
如果为数组中可能存在的每个字符串分配一个质数,然后将数组中的所有元素相乘,则相乘后的数字将代表唯一的组合,但不代表顺序,也不代表数组中的元素。要关闭循环,您只需要比较该乘法的值即可。如果有更好的答案,请使用它,但我想我会分享这个想法。
答案 3 :(得分:0)
在Groovy中,只需对它们进行排序,然后检查排序后的列表:
FB.login(function (response) {
...
}, {scope: ['manage_pages', 'leads_retrieval']});
或者如果它们不能重复,请使用@Baldwin
建议的Sets