Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何比较两个arraylist?_Java_Android - Fatal编程技术网

Java 如何比较两个arraylist?

Java 如何比较两个arraylist?,java,android,Java,Android,我有两个ArrayList。每件都是100000码的。我想比较它们并计算匹配的元素 这是我的密码: for (int i = 0; i < mArryLst2.size(); i++) { if (ArryLst1.contains(mArryLst2.get(i))) { matchedPixels++; } } for(int i=0;i

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

这是我的密码:

for (int i = 0; i < mArryLst2.size(); i++) {
   if (ArryLst1.contains(mArryLst2.get(i))) {
       matchedPixels++;         
   }
}
for(int i=0;i
这里的比较过程需要很多时间


如何解决和优化此问题。

您应该将第一个列表转换为哈希集。HashSet查找为O(1),列表查找为O(n)。这使得整个算法是O(n)而不是O(n^2)

Set set1=新的HashSet(列表1);
for(Foo-Foo:list2){
if(set1.contains(foo)){
匹配像素++;
}
}

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

如果有2个ArrayList ArrayList 1和ArrayList 2,并且希望所有匹配项都位于另一个ArrayList Diff中

HashSet hs = new HashSet();

for(int i : ArrayList1) hs.add(i);

for(int i : ArrayList2)  
 {

if(!hs.add(i))
  Diff.add(i);

 }

你应该看看这个链接。复制其中一个列表,然后针对另一个列表调用该列表的“全部删除”

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

我想会更快

    Set set = new HashSet();
    set.addAll(ArryLst1);

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

对于(int i=0;i您应该使用
CollectionUtils.retainal
:返回包含collection1中也包含在collection2中的所有元素的集合

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

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

    // 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;
        }
    }
公共类CustomClass{
字符串x;
字符串a;
b串;
字符串c;
长l;
@凌驾
公共布尔等于(对象obj){
返回(this.blindlyEquals(obj)&((CustomClass)obj.blindlyEquals(this));
}
受保护的布尔盲等于(对象o){
如果(!(CustomClass的o实例))
返回false;
CustomClass p=(CustomClass)o;
返回(p.x==this.x&&p.a==this.a&&p.b==this.b&&p.c==this.c&&p.l==this.l);
}
}
公共类主类{
ArrayList成员=新的ArrayList();
ArrayList服务器;
/**
*@param args
*/
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
MainClass MainClass=新的MainClass();
mainClass.server=mainClass.getServerList();
mainClass.member=mainClass.getLocalList();
if(mainClass.member.equals(mainClass.server)){
System.out.println(“真”);
//如果需要,运行for循环以检查哪个对象不相等
}否则{
System.out.println(“假”);
//如果需要,运行for循环以检查哪个对象不相等
}
}
公共ArrayList getServerList(){
ArrayList服务器=新建ArrayList();
CustomClass obj=新CustomClass();
CustomClass obj2=新CustomClass();
obj.a=“阿里”;
obj.b=“球”;
obj.c=“cat”;
obj.x=“施乐”;
对象l=10;
obj2.a=“ali”;
obj2.b=“球”;
obj2.c=“cat”;
obj2.x=“施乐”;
obj2.l=10;
server.add(obj);
server.add(obj2);
返回服务器;
}
公共ArrayList getLocalList(){
ArrayList memberOne=新的ArrayList();
CustomClass obj=新CustomClass();
CustomClass obj2=新CustomClass();
obj.a=“阿里”;
obj.b=“球”;
obj.c=“cat”;
obj.x=“施乐”;
对象l=10;
obj2.a=“ali”;
obj2.b=“球”;
obj2.c=“cat”;
obj2.x=“施乐”;
obj2.l=10;
成员一。添加(obj);
memberOne.add(obj2);
返回成员1;
}
}
您可以使用

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

为了方便比较对象,您应该使用集合/哈希集而不是列表/数组列表。数组列表元素的类型是什么?元素是否唯一?看起来是这样的。如果是这样,您应该使用
哈希集,而不是
数组列表
。如果数组1中包含一个元素E,而数组2中包含两个元素E,那么它算是一个匹配项还是两个匹配项?if在两个数组中都包含两次怎么办?那又怎样?OP想检查列表是否包含某些元素。如果它包含元素,集合将包含元素。如果它不包含元素,集合将不包含元素。ops方法的结果可能与他使用hashset时的结果不同,这就是问题所在。不,不能不同。请重新阅读我的注释。tOP不计算元素包含在列表中的次数。它检查元素是否在列表中。它怎么可能在列表中而不在与列表包含相同元素的集合中(只有一次而不是几次)?许多人建议使用此解决方案,但+1解释了为什么它会更快。@JB Nizet:op遍历ArrayList mArryLst2。mArryLst2可能包含重复项..!如果mArryLst2包含元素“1”、“1”和mArryLst2“1”结果将是2。对于哈希集,您将不会得到此结果。如果您想暗示两个ArrayList array1和array2包含相同的元素(如果它们具有相同的哈希代码),那么您就错了!此外,排序只有在元素上有一个总的顺序时才有帮助(OP没有提到),在这种情况下,您可以使用二进制搜索在另一个ArrayList中定位一个ArrayList的元素。为此,您只需对其中一个进行排序。他们需要访问公共元素还是只需要访问它们的计数?请提及jar文件的链接您可以在commons-collections.jar中找到它,有很多网站可以下载它。下载com
ArrayList Listname = ListUtils.retainAll(list1,list2);