如何比较两个数组列表?

我有两个ArrayList 。 每个大小都是100000.我想比较它们并计算匹配的元素。

这是我的代码:

 for (int i = 0; i < mArryLst2.size(); i++) { if (ArryLst1.contains(mArryLst2.get(i))) { matchedPixels++; } } 

这里比较过程花费了很多时间。

如何解决和优化这个问题。

Solutions Collecting From Web of "如何比较两个数组列表?"

您应该使用CollectionUtils.retainAll :返回collection1中包含collection1中的所有元素的集合。

 ArrayList commonList = CollectionUtils.retainAll(list1,list2); 

你应该把你的第一个列表转换成一个HashSet。 HashSet查找是O(1),列表查找是O(n)。 这使得整个algorithmO(n)而不是O(n ^ 2)

 Set<Foo> set1 = new HashSet<Foo>(list1); for (Foo foo : list2) { if (set1.contains(foo)) { matchedPixels++; } } 

你应该看看这个链接如何在Java中比较两个Arraylist值? 。 复制其中一个列表,然后调用另一个列表中的全部列表

 List result = new ArrayList(mArryLst2); result.removeAll(ArryLst1); 

最好的select是将第一个ArrayList的所有元素放入一个Set(它只允许唯一的元素)。
现在,从第二个ArrayList,将每个元素添加到您的设置,如果该元素已经存在于您的设置,那么它将返回false。

如果你有2个arrayLists ArrayList1和ArrayList2,你想在另一个ArrayList Diff中的所有匹配

 HashSet hs = new HashSet(); for(int i : ArrayList1) hs.add(i); for(int i : ArrayList2) { if(!hs.add(i)) Diff.add(i); } 

我想它会更快

  Set set = new HashSet(); set.addAll(ArryLst1); for (int i = 0; i <mArryLst2.size(); i++) { if (set .contains(mArryLst2.get(i))) { matchedPixels++; } } 

有几种方法可以加快速度(特别是对于大型数组)并简化代码;

  // Quick Check to see if the two arrayLists have the same number of elements if (array1.size() != array2.size()) return false; // Optionally Sort the arrays - avoid returning false if the elements are the same but // have been stored out of sequence Collections.sort(array1); Collections.sort(array2); if (array1.hashCode() == array2.hashCode()) { return true; } else { return false; } 

最好的办法是重写equals方法,并检查数组中的每个对象是否相等。

  public class CustomClass { String x; String a; String b; String c; long l; @Override public boolean equals(Object obj) { return (this.blindlyEquals(obj) && ((CustomClass) obj).blindlyEquals(this)); } protected boolean blindlyEquals(Object o) { if (!(o instanceof CustomClass)) return false; CustomClass p = (CustomClass)o; return (px == this.x && pa == this.a && pb == this.b && pc == this.c && pl == this.l); } } public class MainClass { ArrayList<CustomClass> member = new ArrayList<CustomClass>(); ArrayList<CustomClass> server; /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub MainClass mainClass = new MainClass(); mainClass.server = mainClass.getServerList(); mainClass.member = mainClass.getLocalList(); if(mainClass.member.equals(mainClass.server)){ System.out.println("true"); //do the needfull, run a for loop to check which object is not equal }else{ System.out.println("false"); //do the needfull, run a for loop to check which object is not equal } } public ArrayList<CustomClass> getServerList(){ ArrayList<CustomClass> server = new ArrayList<CustomClass>(); CustomClass obj = new CustomClass(); CustomClass obj2 = new CustomClass(); obj.a = "ali"; obj.b = "ball"; obj.c = "cat"; obj.x = "xerox"; obj.l = 10; obj2.a = "ali"; obj2.b = "ball"; obj2.c = "cat"; obj2.x = "xerox"; obj2.l = 10; server.add(obj); server.add(obj2); return server; } public ArrayList<CustomClass> getLocalList(){ ArrayList<CustomClass> memberOne = new ArrayList<CustomClass>(); CustomClass obj = new CustomClass(); CustomClass obj2 = new CustomClass(); obj.a = "ali"; obj.b = "ball"; obj.c = "cat"; obj.x = "xerox"; obj.l = 10; obj2.a = "ali"; obj2.b = "ball"; obj2.c = "cat"; obj2.x = "xerox"; obj2.l = 10; memberOne.add(obj); memberOne.add(obj2); return memberOne; } } 

您可以使用

 ArrayList Listname = ListUtils.retainAll(list1,list2);