在java中比较两个ArrayLists时出错

时间:2013-01-31 21:59:13

标签: java loops arraylist boolean compare

我正在尝试编写一个方法,它接受2个双精度数组列表并返回set1中找不到的所有值。这些数字应该在set3中返回。我不断收到内存错误。有人能指出我正确的方向吗?

ArrayList<Double> setDiff(ArrayList<Double> set1, ArrayList<Double> set2){
    ArrayList<Double> set3 = new ArrayList<Double>();
    int count = 0;
    while(count < set1.size()){
        boolean inList = false;
        while(inList == false){
            int count2 = 0;
            while(count2 < set2.size() && set1.get(count) == set2.get(count2)){
                count2++;
            }
            if(count2 != set2.size()){
                set3.add(set1.get(count));
            }
            else{
                inList = true;
                count++;
            }
        }
    }

    return set3;
}

3 个答案:

答案 0 :(得分:2)

我建议使用Collection utils Disjunction

  

返回包含独占析取的Collection(对称   给定集合的差异。

     

返回的Collection中每个元素e的基数将是   等于max(基数(e,a),基数(e,b)) -   分钟(基数(即,a)中,基数(E,B))。

     

这相当于减去(union(a,b),intersection(a,b))或   联盟(减去(A,B),减(B,A))。

答案 1 :(得分:2)

有些循环很可能没有像你期望的那样停止。

以下代码片段与您尝试的完全相同。

for (Double d : set1) {
    if (!set2.contains(d)) {
        set3.add(d);
    }
}

更新:既然你说你不能使用contains(),你可以自己执行检查:

for (Double d : set1) {
        boolean found = false;
        for (int i=0; i<set2.size() && !found; i++) {
                if (d.equals(set2.get(i))) {
                    found = true;
            }
        }
        if (!found) {
            set3.add(d);
        }
}

编辑:此外,代码中的问题在于

  if(count2 != set2.size()){

您应该使用&gt;更改!=,因为在count2小于set2的情况下,外部计数变量不会增加,导致无限循环,并在几秒后出现OutOfMemoryError。

此外,您的算法也不是100%正确,因为循环通过第二个列表不一致。您可以在下面看到类似的while循环方法:

                int count = 0;
                while (count < set1.size()) {
                    boolean inList = false;
                    int count2 = 0;
                    while (inList == false && count2 < set2.size()) {
                        if (set1.get(count).equals(set2.get(count2))) {
                            inList = true;
                        }
                        count2++;
                    }
                    if (!inList) {
                            set3.add(set1.get(count));
                    }
                    count++;
               }

答案 2 :(得分:2)

在做这些comaprisons之前对列表进行排序可能是有利的,然后可以更有效地执行搜索项目。

您也可以尝试这样做:

set1.removeAll(set2)

set1中剩余的项目是不在set2中的项目