我正在尝试搜索数组列表以查找值(可能会重新发生)并删除该值的所有实例。我还想从单独的数组列表中删除位于同一位置的值。两个ArrayLists都是ArrayList<String>
。
例如我在寻找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);
}
}
当我打印数组列表时,它们看起来基本没有变化。有谁看到我做错了什么?
答案 0 :(得分:8)
当您同时循环并从数组中删除项目时,您编写的算法不正确,因为它会在每次删除后跳过下一个项目(由于您增加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;
}
}
答案 1 :(得分:1)
如果要迭代集合并删除同一集合的元素,则必须使用Iterator
,例如:
List<String> names = ....
List<Integer> numbers = ....
int index = 0;
Iterator<String> 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++;
}
修改强>
在您的情况下,您必须手动增加变量才能从其他列表中删除项目。
答案 2 :(得分:1)
您可以使用两个迭代器:
Iterator<String> i1 = arrayList1.iterator();
Iterator<Integer> i2 = arrayList2.iterator();
while (i1.hasNext() && i2.hasNext()) {
i1.next();
if (i2.next() == s) {
i1.remove();
i2.remove();
}
}
虽然已经指出,但使用地图可能会更容易。
答案 3 :(得分:0)
我认为contains方法比较两个对象。但是,对象“s”与ArrayList中的对象不同。您应该使用类型化数组(即ArrayList)并确保比较每个对象的值,而不是对象本身......
答案 4 :(得分:0)
您应该按以下方式声明您的列表 -
List<String> list1 = new ArrayList<String>();
//...
List<Integer> list2 = new ArrayList<Integer>();
//...
而不是contains
方法使用equals
方法。
同样要在迭代列表时删除,请使用Iterator
,如下所示 -
Iterator<String> it1 = list1.iterator();
Iterator<Integer> it2 = list2.iterator();
//...
答案 5 :(得分:0)
您可能想要检查ArrayList的indexOf()方法,但是在迭代它的元素时从列表中删除时必须要小心。
答案 6 :(得分:0)
这是一个直接的解决方案:
List<Integer> origNums = new ArrayList<Integer>(nums);
Iterator<String> animalIter = animals.iterator();
Iterator<Integer> 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]
答案 7 :(得分:0)
我同意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);
它将删除包含狗和狼的列表。