Java 将一个arraylist与另一个arraylist进行比较并删除额外的项

Java 将一个arraylist与另一个arraylist进行比较并删除额外的项,java,arraylist,Java,Arraylist,在这个方法中,我试图将一个arraylist中的所有元素与另一个arraylist中的所有元素进行比较。然后,如果第一个arraylist中的元素不等于第二个arraylist中的任何元素,请删除该元素。比较步骤或删除步骤都有问题,但我不确定是哪一步。任何帮助都将不胜感激 如果你想要澄清,请毫不犹豫地询问 public static ArrayList<Integer> compareArrayandList(ArrayList<Integer>compare, Arra

在这个方法中,我试图将一个arraylist中的所有元素与另一个arraylist中的所有元素进行比较。然后,如果第一个arraylist中的元素不等于第二个arraylist中的任何元素,请删除该元素。比较步骤或删除步骤都有问题,但我不确定是哪一步。任何帮助都将不胜感激

如果你想要澄清,请毫不犹豫地询问

public static ArrayList<Integer> compareArrayandList(ArrayList<Integer>compare, ArrayList<Integer>array2) {
    int[] counter = new int[compare.size()];

    for (int x: counter) {
        x = 0;
    }
    for (int i = 0; i < compare.size(); i++) {
        counter[i] = 0;
        for (int number: array2) {
            if (compare.get(i) ==number) {
                counter[i]++;
            }

        }

    }
    for (int i=0; i<counter.length;i++) {
        if (counter[i]==0) {
            compare.remove(new Integer(i));
        }
    }

    return compare;
}
public静态ArrayList comparararayandlist(ArrayListcompare,arraylistaray2){
int[]计数器=新的int[compare.size()];
用于(整数x:计数器){
x=0;
}
对于(int i=0;i对于(int i=0;i您并不是在做您真正想做的事情。您从比较数组中删除了其值为i的元素,而不是在第二个for循环中找不到的位置i处的元素

for (int i=0; i<counter.length;i++) {
    if (counter[i]==0) {
        //compare.remove(new Integer(i));  // problem is here!
        // remove element at index i not element equals to i
        compare.remove(i);
    }
}

for(int i=0;i您不需要计数器数组。如果使用迭代器,您可以一步完成比较。我相信这应该可以:

public static ArrayList<Integer> compareArrayandList(ArrayList<Integer>compare,   ArrayList<Integer>array2) {
    ListIterator<Integer> iter = compare.listIterator(compare.size());
    while (iter.hasPrevious()){
        Integer a = new Integer(iter.previous());
        for (int number: array2) {
            if (a==number) iter.remove();
        }        
     }
return compare;
}
public静态ArrayList comparararayandlist(ArrayListcompare,arraylistaray2){
ListIterator iter=compare.ListIterator(compare.size());
while(iter.hasPrevious()){
整数a=新整数(iter.previous());
for(整数编号:array2){
如果(a==number)iter.remove();
}        
}
返回比较;
}
编辑:代码不起作用的原因是,当您删除元素时,ArrayList中的位置正在更改。假设您删除了元素3。现在元素3与以前不同。

public class Test{
public class Test {

    public static ArrayList<Integer> compareArrayandList(ArrayList<Integer>compare, ArrayList<Integer>array2) {
        ArrayList<Integer> a3 = new ArrayList<Integer>();               
        for (Integer a : compare)
        {
            if(array2.contains(a))
                a3.add(a);
        }
            System.out.println(a3);
        return a3;
    }

    public static void main(String[] args) {
        ArrayList<Integer> a1=new ArrayList<Integer>();
        ArrayList<Integer> a2=new ArrayList<Integer>();
        a1.add(1);
        a1.add(5);
        a1.add(3);
        a2.add(3);
        a2.add(4);
        a2.add(5);
        a2.add(6);
        Test test=new Test();
        test.compareArrayandList(a1,a2);

    }

}
公共静态ArrayList CompararayAndList(ArrayList比较,ArrayListarray2){ ArrayList a3=新的ArrayList(); for(整数a:比较) { 如果(数组2.包含(a)) a3.加入(a); } 系统输出打印LN(a3); 返回a3; } 公共静态void main(字符串[]args){ ArrayList a1=新的ArrayList(); ArrayList a2=新的ArrayList(); a1.加入第(1)款; a1.加入第(5)款; a1.加入第(3)款; a2.加入第(3)款; a2.加入(4); a2.加入(5); a2.加入(6); 测试=新测试(); 测试。比较RAYANDLIST(a1,a2); } }
这确实是更好的方法,但他永远不知道自己的代码中有什么错误!因此我在compare.hasPrevious()中得到了一个语法错误因为我不知道迭代器是什么,更不用说如何使用迭代器了,所以我不知道如何修复它。@user2172926让我试着运行它。.我只是编造了那段代码。我可能弄错了什么。@user2172926我编辑了代码。这是一个愚蠢的错误。现在应该可以工作了。迭代器的想法是,它是一种通过结构“迭代”的方法在这个例子中,iter.previous()将从ArrayList中为您提供上一个值。这样,它将在整个ArrayList中运行。while循环将检查是否有另一个值要检索,因此当它到达列表的开头时,它将停止。实际上,您可以通过使用for循环并遍历ArrayList bac,在没有迭代器的情况下执行相同的操作kwards@user2172926之所以要向后看,是因为当你删除一个元素时,列表中以前的值不会改变。向前看时情况并非如此,因为删除一个元素时,元素会下移。不,这是故意的。我使用计数器的这种解决方法试图解决修改lis的问题当for循环仍在运行时。但由于某些原因,它不能正常工作。此解决方案有效。只想指出它应该返回(a3);作为最后一行,因为这是修改过的列表。非常感谢!我假设这是一种作业。否则,我建议使用list1.Retainal(list2)-它正是你想要的。
public class Test {

    public static ArrayList<Integer> compareArrayandList(ArrayList<Integer>compare, ArrayList<Integer>array2) {
        ArrayList<Integer> a3 = new ArrayList<Integer>();               
        for (Integer a : compare)
        {
            if(array2.contains(a))
                a3.add(a);
        }
            System.out.println(a3);
        return a3;
    }

    public static void main(String[] args) {
        ArrayList<Integer> a1=new ArrayList<Integer>();
        ArrayList<Integer> a2=new ArrayList<Integer>();
        a1.add(1);
        a1.add(5);
        a1.add(3);
        a2.add(3);
        a2.add(4);
        a2.add(5);
        a2.add(6);
        Test test=new Test();
        test.compareArrayandList(a1,a2);

    }

}