繁体   English   中英

如何比较两个arraylist?

[英]How to compare two arraylist?

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

这是我的代码:

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

这里的比较过程耗费了大量时间。

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

您应该使用CollectionUtils.retainAll :返回一个集合,其中包含collection1中也在collection2中的所有元素。

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

您应该将第一个列表转换为HashSet。 HashSet查找是O(1),列表查找是O(n)。 这使得整个算法O(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); 

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

    // 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 (p.x == this.x && p.a == this.a && p.b == this.b && p.c == this.c && p.l == 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);

最好的选择是将第一个ArrayList的所有元素放入一个Set(它只允许使用唯一元素)。
现在,从你的第二个ArrayList中,将每个元素添加到你的Set中,如果你的集合中已经存在该元素,那么它将返回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++;        
       }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM