比较Java中的两个ArrayLists

时间:2013-01-31 08:33:40

标签: java loops methods arraylist compare

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

3 个答案:

答案 0 :(得分:3)

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

考虑到工具包中的限制,我怀疑这是你的作业。所以,我只想告诉你如何接近。

您可以使用boolean变量,并在{{{{{}}找到当前元素时将其切换为(例如将其设置为 false ) 1}},然后突破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,否则请添加它。

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

答案 1 :(得分:0)

您可以尝试使用Apache commons CollectionUtils.removeAll方法:此方法返回一个集合,其中包含c中未删除的所有元素。

ArrayList commonList = CollectionUtils.removeAll(arrayList1, arrayList2);

答案 2 :(得分:0)

static ArrayList<Double> setDiff(ArrayList<Double> set1, ArrayList<Double> set2) {
    ArrayList<Double> copy1 = (ArrayList<Double>) set1.clone();
    copy1.retainAll(set2);
    ArrayList<Double> copy2 = (ArrayList<Double>) set1.clone();
    copy2.removeAll(copy1);
    return copy2;
}

public static void main(String[] args) throws Exception {
    ArrayList l1 = new ArrayList(Arrays.asList(1.0, 2.0, 3.0, 4.0, 5.0));
    ArrayList l2 = new ArrayList(Arrays.asList(1.0, 7.0, 9.0, 5.0, 3.0));
    System.out.println(setDiff(l1, l2));
}

打印

[2.0, 4.0]

此外,我建议将方法签名更改为

<T> List<T> listDiff(List<T> list1, List<T> list2)