我将从我的数据库获得两个Arraylists值,我将拥有两个具有相同数量的元素并具有相同顺序的ArrayLists。
我正在做一个测试,我需要比较两个ArrayLists。
以下是演示我遵循的方法的示例程序。 请告诉我是否有可能出现的环洞,我可能会错过。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
public class Test {
public static void main(String args[]) throws Exception {
ArrayList<String> list1 = new ArrayList<String>();
ArrayList<String> list2 = new ArrayList<String>();
list1.add("Ravi");
list1.add("fdfsd");
list1.add("Sai");
list2.add("Ravi");
list2.add("fdfsd");
list2.add("Sai");
if(list1!=null && list2!=null){
if(list1.size()==list2.size()){
for (int i = 0; i < list2.size(); i++) {
if (!list1.contains(list2.get(i))) {
System.out.println("Mismatch");
}
}
for (int i = 0; i < list1.size(); i++) {
if (!list2.contains(list1.get(i))) {
System.out.println("Mismatch");
}
}
}else if(list1.size()!=list2.size()){
System.out.println("Mismatch");
}
}
}
}
答案 0 :(得分:5)
首先,您不需要第二个循环。第一个循环本身就可以完成这项工作。其次,使用list1.equals(list2);
有什么问题?来自List#equals(Object o)
doc:
将指定对象与此列表进行比较以获得相等性。当且仅当指定的对象也是列表时,返回
true
,两个列表具有相同的大小,并且两个列表中的所有对应元素对都相等。 (如果e1
,则两个元素e2
和(e1==null ? e2==null : e1.equals(e2))
相等。)换句话说,如果两个列表包含相同顺序的相同元素,则它们被定义为相等。此定义确保equals
方法在List
接口的不同实现中正常工作。
因此,只有列表中元素的顺序相同时,equals()
才有效。此外,对于例如Lists
的元素类型不覆盖equals()
方法的情况,这不起作用,例如:
List<int[]> list1 = Arrays.asList(new int[] {1, 2});
List<int[]> list2 = Arrays.asList(new int[] {1, 2});
System.out.println(list1.equals(list2)); // false
因此,要使List<E>.equals()
方法起作用,元素类型E
必须覆盖equals()
,因此也必须覆盖hashCode()
。在你的情况下,因为你有String
作为元素类型,它会正常工作(当然,除非元素的顺序不同)。
例如,这也会失败:
List<String> list1 = Arrays.asList("a", "b");
List<String> list2 = Arrays.asList("b", "a");
list1.equals(list2); // false
因此,如果顺序很重要,从某种意义上说,如果您不确定列表元素是否处于相同的顺序,那么您可以排序两个列表,然后执行{{1} }:
equals()
答案 1 :(得分:1)
我正在做一个测试,我需要比较两个ArrayLists。
List
界面中有许多Util方法可以检查这一点。
我猜你需要containsAll()
方法。
如果此列表包含指定集合的所有元素,则返回true。
http://docs.oracle.com/javase/7/docs/api/java/util/List.html#containsAll(java.util.Collection)
如果它们没有按顺序排列,
在比较之前进行排序
Collections.sort(list1);
Collections.sort(list2);
然后比较它们。
答案 2 :(得分:0)
您可以使用List#removeAll(Collection)
方法,并在从第一个列表中删除第二个列表后检查列表的大小。如果它大于0,则其不匹配。你需要先检查尺寸!
这样的事情: -
if (list1.size() == list2.size()) {
list1.removeAll(list2);
if (list1.size() == 0) {
System.out.println("Match!");
} else {
System.out.println("Mismatch!");
}
} else {
System.out.println("Mismatch!");
}