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