我正在尝试编写一个方法,该方法接受2个双精度的ArrayList,并返回set1中未在set2中找到的所有值。这些数字应在set3中返回。通常我只使用set.contains,但是我只能使用set.get set.size和set.add。谁能指出我正确的方向?

例如:

如果set1具有数字1,2,3,4,5

set2的数字为1,7,9,5,3

set3应该只包含2,4,5

ArrayList<Double> setDiff(ArrayList<Double> set1, ArrayList<Double> set2){
    ArrayList<Double> set3 = new ArrayList<Double>();
    for(int i = 0; i < set1.size(); i++){
        for(int x = 0; x < set2.size(); x++){
            if(set1.get(i) != set2.get(x)){
                set3.add(set1.get(i));
            }
        }
    }
    return set3;
}

最佳答案

问题是,您是根据第一次失败将数字添加到set3。因此,如果set2的第一个元素与set1的当前元素不匹配,则将其添加到set3

考虑到工具包中的限制,我怀疑这是您的作业。所以,我只给您一个有关如何处理的想法。

一旦在boolean中找到当前元素,就可以使用false变量并将其切换(例如,将其设置为set2),然后脱离inner loop

因此,您在内部循环中的状态将发生以下变化:-

if(set1.get(i) != set2.get(x))


至: -

if(set1.get(i) == set2.get(x)) {
    // The current element in set1 is present in set2.
    // toggle the boolean variable
    // break out of loop. As you no more want to check for further elements.
}


然后在inner loop之外,检查该boolean变量的状态。并且根据状态,您可以将当前项目添加或不添加到set3。例如如果布尔变量为false,则意味着您在set2中找到了该元素,因此请不要将其添加到set3中,否则请添加它。

您还需要每次在外循环开始时重置布尔变量。

09-11 17:21