Java ArrayList搜索和删除
我试图在数组列表中搜索一个值(可能会再次出现),并删除该值的所有实例。我还想从一个单独的数组列表中删除位于同一位置的值。两个ArrayList都是Java ArrayList搜索和删除,java,arraylist,Java,Arraylist,我试图在数组列表中搜索一个值(可能会再次出现),并删除该值的所有实例。我还想从一个单独的数组列表中删除位于同一位置的值。两个ArrayList都是ArrayList 例如,我正在ArrayList 2中查找数字5: ArrayList 1 ArrayList2 cat 1 pig 2 dog 5 chicken 3 wolf 5 一旦我在两个位置找到数字
ArrayList
例如,我正在ArrayList 2中查找数字5:
ArrayList 1 ArrayList2
cat 1
pig 2
dog 5
chicken 3
wolf 5
一旦我在两个位置找到数字5,我想从ArrayList 1中删除dog和wolf。我的代码没有错误,但它似乎并没有真正删除我所要求的内容
//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);
}
}
//搜索
字符串s=“5”;
//对于arraylist的大小
对于(int p=0;p如果要在集合上迭代并删除同一集合的元素,则必须使用,例如:
列表名称=。。。。
列表编号=。。。。
int指数=0;
迭代器i=names.Iterator();
while(i.hasNext()){
必须先调用字符串s=i.next();//才能调用i.remove()
如果(s.equals(“狗”){
i、 删除();
删除(索引);
}
索引++;
}
编辑
在您的情况下,必须手动增加一个变量,才能从其他列表中删除项。我认为contains方法比较了两个对象。但是,对象“s”与ArrayList中的对象不同。您应该使用类型化数组(即ArrayList)并确保比较每个对象的值,而不是对象本身…您应该如下声明您的列表-
List<String> list1 = new ArrayList<String>();
//...
List<Integer> list2 = new ArrayList<Integer>();
//...
Iterator<String> it1 = list1.iterator();
Iterator<Integer> it2 = list2.iterator();
//...
当你同时循环并从数组中移除项时,你写的算法是不正确的,因为它跳过每个移除之后的下一个项目(由于增加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;
}
}
ints=5;
int-idx=0;
而(idx
您可能希望检查ArrayList的方法,但在迭代列表元素时从列表中删除时必须小心。您可以使用两个迭代器:
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();
}
}
Iterator i1=arrayList1.Iterator();
迭代器i2=arrayList2.Iterator();
while(i1.hasNext()&&i2.hasNext()){
i1.next();
if(i2.next()==s){
i1.删除();
i2.移除();
}
}
尽管已经指出,使用地图可能更容易。这里有一个简单的解决方案:
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]
List origNums=新数组列表(nums);
迭代器animalIter=动物。迭代器();
迭代器numIter=nums.Iterator();
while(animalIter.hasNext()){
动物学家;
//表示重复?
if(Collections.frequency(origNums,numIter.next())>1){
//从两个列表中删除当前元素。
animalIter.remove();
numIter.remove();
}
}
System.out.println(动物);//[猫、猪、鸡]
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);
它将删除包含狗和狼的列表。您不想使用地图吗
?这将大大简化此过程。我不知道地图…我会看看我能在上面找到什么。感谢@Makoto on的支持:为什么要维护两个平行列表?其他一些数据结构可能更适合此列表我不确定我是否理解。你能进一步解释一下吗?问题是,这个物体值为5的对象的实例与列表中值为5的对象的实例不同。contains方法返回true,如果两个对象相同,则为同一实例。因此,它在代码中始终为您返回false,并且不会删除这些对象。解决方案已由许多其他人编写。请使用类型化列表,改用equals方法普通ArrayList和contains方法。这个解决方案非常有效!我知道在迭代时我是如何更改数组大小的。非常感谢!
aMap.remove(5);