1

我正在尝试编写一个方法,该方法采用 2 个双精度数组列表并返回 set1 中未在 set2 中找到的所有值。这些数字应在 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;
}
4

3 回答 3

2

我建议使用Collection utils Disjunction

返回一个包含给定集合的排他析取(对称差)的集合。

返回集合中每个元素 e 的基数将等于 max(cardinality(e,a),cardinality(e,b)) - min(cardinality(e,a),cardinality(e,b))。

这等价于减法(union(a,b),intersection(a,b)) 或 union(减法(a,b),subtract(b,a))。

于 2013-01-31T22:00:44.947 回答
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()){

你应该用>改变!=,因为在count2小于set2的情况下,外部count变量不会增加,导致无限循环,几秒钟后,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++;
               }
于 2013-01-31T22:01:55.203 回答
2

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

您也可以尝试这样做:

set1.removeAll(set2)

set1 中剩余的项目是 set2 中没有的项目

于 2013-01-31T22:02:13.700 回答