Java 未从ArrayList中删除元素

Java 未从ArrayList中删除元素,java,arrays,arraylist,Java,Arrays,Arraylist,我试图从arrayList中删除不包含特定字符串的元素,但运气不佳。我正在使用以下代码: ArrayList<String> classes = ClassesRetrieval.getYagoClasses(); Iterator<String> it = classes.iterator(); while(it.hasNext()){ if(it.next().contains("yago")){ it.remove();

我试图从arrayList中删除不包含特定字符串的元素,但运气不佳。我正在使用以下代码:

  ArrayList<String> classes = ClassesRetrieval.getYagoClasses();
  Iterator<String> it = classes.iterator();
   while(it.hasNext()){
     if(it.next().contains("yago")){
         it.remove();
     }
  }
  for(String i : classes){
      System.out.println(i);
  }
我也试过了

      for(int i=0;i<classes.size();i++){
         if(!classes.get(i).contains("yago")){
         classes.remove(i);
          }
      }
      for(String i : classes){
          System.out.println(i);
      }

但是运气不好。

首先,删除“!”在第二个代码中,如果!classes.geti.containsyago,我认为它应该可以工作。
如果不能,请给出ClassesRetrieval.getYagoClasses;的一些基本代码;,请。

我在自己创建的列表上测试了您的第一个代码。它起作用了,但是如果您想删除不包含yago的字符串,您将丢失一个


可能需要反向迭代以避免索引问题。试着这样做:

for(int i=classes.size()-1; i>=0; i--)
{
  //get a string from list
  String s = classes.get(i);
  if(!s.contains("yago"))
  {
    //if the string does not contain yago, remove it
    classes.remove(i);
  }
}
  for(int i=0;i<classes.size();i++){
     if(!classes.get(i).contains("yago")){

     System.out.println(classes.remove(i));
      }
  }

不建议使用for循环删除元素。考虑有两个连续的字符串,它们都包含YAGO。它将删除第一个字符串,即增量i,并跳过第二个字符串,因为它现在具有第一个字符串的索引

尝试一个while循环,其中只有在不删除元素的情况下才递增,或者,如果不喜欢分支,则将for循环从大到小反转


至于您的第一个示例,现在它删除了所有包含yago的内容。如果你放一个!在条件出现之前,它应该可以正常工作。

我看不出您的语法/逻辑有任何错误。然而,有可能出现以下情况:

!classes.get(i).contains("yago")
没有得到满足。为了测试这是否为真,如果条件为真,我会打印一些东西。例如:

  for(int i=0;i<classes.size();i++){
     if(!classes.get(i).contains("yago")){
     classes.remove(i);
     System.out.println("Condition Met");
      }
  }
您甚至可以按如下方式打印已删除的元素:

for(int i=classes.size()-1; i>=0; i--)
{
  //get a string from list
  String s = classes.get(i);
  if(!s.contains("yago"))
  {
    //if the string does not contain yago, remove it
    classes.remove(i);
  }
}
  for(int i=0;i<classes.size();i++){
     if(!classes.get(i).contains("yago")){

     System.out.println(classes.remove(i));
      }
  }

我希望这对您有所帮助。

您展示的第二段代码应该可以工作。你为什么用否定词!在你的for循环中? 我想你想要的是:

for(int i=0; i<classes.size(); i++){
    if(classes.get(i).contains("yago")){
        classes.remove(i);
    }
}
这种方法的问题是,当您从列表中删除一个元素时,会更改它的大小。如果ArrayList不符合以下条件,则可以创建一个空的ArrayList并继续向其中添加新元素:

List<String> tmp = new ArrayList();
for(String token : classes){
    if(!token.contains("yago")){
        tmp.add(token);
    }
}

for(String i : tmp){
    System.out.println(i);
}

是否要删除包含或不包含yago的字符串?您的jdk版本是什么?@Eran不包含yago。对不起,我更正了!您确定字符串实际上包含yago而不是yago、yago等吗@用户1350162不,不会的,因为你错过了!。它会保留所有的字符串。这更多的是一个评论而不是一个答案。是的,但我不能发表评论。你仍然应该小心将评论作为答案发表,即使你不能将它们作为评论发表;有些人投了反对票,也可以为此升起旗帜。在你建立了更多的代表之前,我认为你不需要更多,最好坚持完整的答案,在这种情况下,OP没有提供足够的信息来给出正确的答案。谢谢,我从上面的评论中得到了你!我不知道为什么我忘了!就个人而言,我更喜欢int I=大小;i->0;{因为相同的构造也适用于无符号数字。ALOWS contains比indexOf<0更清晰。对不起,我是说!contains!