有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中比较两个ArrayList的循环

我正在尝试编写一个方法,它接受两个双精度数组列表,并返回set1中所有在set2中找不到的值。这些数字应该在set3中返回。通常我只会使用set。包含但我只能使用set。准备好。大小和设置。添加谁能给我指出正确的方向吗

例如:

如果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) 个答案

  1. # 1 楼答案

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

    考虑到工具箱中的限制,我怀疑这是你的家庭作业。所以,我会给你一个方法的想法

    只要在set2中找到当前元素,就可以使用boolean变量并切换它(例如,将其设置为false),然后从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,否则请添加它

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

  2. # 2 楼答案

    试试看

    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)
    
  3. # 3 楼答案

    您可以尝试使用ApacheCommons CollectionUtils.removeAll方法:该方法返回一个集合,其中包含c中不在remove中的所有元素

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