有 Java 编程相关的问题?

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

java从另一个arrayList中减去一个arrayList

我有两个arrayList,我正在尝试从一个arrayList中“减去”另一个arrayList。例如,如果我有一个arrayList[1,2,3],并且我试图减去[0,2,4],那么得到的arrayList应该是[1,3]

List<Integer> a = new ArrayList<>(Arrays.asList(1, 2, 3));
List<Integer> b = Arrays.asList(0, 2, 4);
subtract(a,b) // should return [1,3]

这是我的密码

//returns a new IntSet after subtracting a from b
// .minus().toString()
ArrayList<Integer> minusArray = new ArrayList<Integer>();

    minusArray.addAll(array1);

    for(int i =0; i< minusArray.size(); i++){
        for(int j = 0; j < array2.size(); j++){
            if(minusArray.get(i).equals(array2.get(j))){
                minusArray.remove(i);
                if(i == 0){
                    ;
                }
                else if(j == 0){
                    ;
                }
                else{
                    i = 0;
                    j = 0;
                }
            }
            else{}
        }
    }

return minusArray;

我的代码在某些情况下可以工作,比如如果arrayList1 = [4,6]arrayList2 = [6],它会给我一个[4]的结果。但是如果我尝试[1,2,4][0,4,8]

我有一个例外:

java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at IntSet.minus(IntSet.java:119)
    at IntSetDriver.main(IntSetDriver.java:62)

这是我想出的代码。我已经做了测试,对我来说,我认为它应该有效。用户输入这些数组列表,然后对它们进行预排序,我也不知道哈希或大O

ArrayList<Integer> minusArray = new ArrayList<Integer>();

    minusArray.addAll(array1);

    for(int i =0; i< minusArray.size(); i++){
        for(int j = 0; j < array2.size(); j++){
            if(minusArray.get(i).equals(array2.get(j))){
                minusArray.remove(i);
            }
            else{}
        }
    }

return minusArray;

共 (3) 个答案

  1. # 1 楼答案

    尝试使用组织的减法。阿帕奇。平民收藏。CollectionUtils类

    返回一个包含a-b的新集合。返回集合中每个元素e的基数将是a中e的基数减去b中e的基数,或零,以较大者为准

    CollectionUtils.subtract(java.util.Collection a, java.util.Collection b) 
    

    Apache Commons Collections

  2. # 2 楼答案

    有什么原因不能简单地使用列表吗。移除所有(列表)

        List<Integer> one = new ArrayList<Integer>();
        one.add(1);
        one.add(2);
        one.add(3);
        List<Integer> two = new ArrayList<Integer>();
        two.add(0);
        two.add(2);
        two.add(4);
        one.removeAll(two);
        System.out.println(one);
    
        result: "[1, 3]"
    
  3. # 3 楼答案

    你的问题是在你的数组中。删除(…)你可以缩小数组的大小。要解决此问题,请从数组开始。size()-1,然后倒数到0

    检查一下,即使这样也不能解决问题。你需要颠倒循环的顺序