Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList搜索和删除_Java_Arraylist - Fatal编程技术网

Java 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

例如,我正在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);