Java ArrayList搜索和删除

我试图搜索数组列表以查找值(可能会重新发生)并删除该值的所有实例。 我还想从单独的数组列表中删除位于同一位置的值。 两个ArrayLists都是ArrayList

例如,我在ArrayList2中寻找数字5:

 ArrayList 1 ArrayList2 cat 1 pig 2 dog 5 chicken 3 wolf 5 

一旦我在两个位置找到数字5,我想从ArrayList1中移除狗和狼。 我的代码没有错误,但似乎并没有真正删除我所要求的。

 //searching for String s="5"; //for the size of the arraylist for(int p=0; p<ArrayList2.size(); p++){ //if the arraylist has th value of s if(ArrayList2.get(p).contains(s)){ //get the one to remove String removethis=ArrayList2.get(p); String removetoo=ArrayList1.get(p); //remove them ArrayList2.remove(removethis); ArrayList1.remove(removetoo); } } 

当我打印数组列表时,它们看起来基本没有变化。 有谁看到我做错了什么?

当您同时循环并从数组中删除项目时,您编写的算法不正确,因为它会在每次删除后跳过下一个项目(由于您增加p的方式)。 考虑这个选择:

 int s = 5; int idx = 0; while (idx < ArrayList2.size()) { if(ArrayList2.get(idx) == s) { // Remove item ArrayList1.remove(idx); ArrayList2.remove(idx); } else { ++idx; } } 

您可以使用两个迭代器:

 Iterator i1 = arrayList1.iterator(); Iterator i2 = arrayList2.iterator(); while (i1.hasNext() && i2.hasNext()) { i1.next(); if (i2.next() == s) { i1.remove(); i2.remove(); } } 

虽然正如已经指出的那样,使用地图可能会更容易。

如果你想迭代一个集合并删除同一个集合的元素,那么你将不得不使用一个Iterator ,例如:

 List names = .... List numbers = .... int index = 0; Iterator i = names.iterator(); while (i.hasNext()) { String s = i.next(); // must be called before you can call i.remove() if (s.equals("dog"){ i.remove(); numbers.remove(index); } index++; } 

编辑

在您的情况下,您必须手动增加变量才能从其他列表中删除项目。

我认为contains方法比较两个对象。 但是,对象“s”与ArrayList中的对象不同。 您应该使用类型化数组(即ArrayList)并确保比较每个对象的值,而不是对象本身…

您应该如下声明您的清单 –

 List list1 = new ArrayList(); //... List list2 = new ArrayList(); //... 

而不是contains方法使用equals方法。

同样在迭代列表时删除使用Iterator ,你可以得到如下 –

 Iterator it1 = list1.iterator(); Iterator it2 = list2.iterator(); //... 

您可能想要检查ArrayList的indexOf()方法,但是在迭代它的元素时从列表中删除时必须要小心。

这是一个直接的解决方案:

 List origNums = new ArrayList(nums); Iterator animalIter = animals.iterator(); Iterator numIter = nums.iterator(); while (animalIter.hasNext()) { animalIter.next(); // Represents a duplicate? if (Collections.frequency(origNums, numIter.next()) > 1) { // Remove current element from both lists. animalIter.remove(); numIter.remove(); } } System.out.println(animals); // [cat, pig, chicken] System.out.println(nums); // [1, 2, 3] 

我同意Makoto,使用Map可能更有益。 如果您只使用ArrayList2的值进行搜索,则一个键有多个值。 例如,5指的是狗和狼。 为此,您可以向键添加值列表 – 5。

 HashMap aMap = HashMap(); ArrayList key5 = new ArrayList(); key5.add("dog"); key5.add("wolf"); aMap.put(5, key5); 

所以当你需要删除5的所有值时,你就可以了

 aMap.remove(5); 

它将删除包含狗和狼的列表。