元素未从ArrayList中删除

时间:2014-08-22 14:35:54

标签: java arrays arraylist

我试图从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);
      }

但没有运气..

6 个答案:

答案 0 :(得分:0)

首先,删除&#39;!&#39;在你的第二个代码if(!classes.get(i).contains("yago")),我认为它应该工作。 如果它不胜,请提供一些基本代码ClassesRetrieval.getYagoClasses();

答案 1 :(得分:0)

我在我自己创建的列表上测试了第一个代码。它有效,但是如果你想删除不包含“yago”的字符串,你就错过了!

  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);
  }

答案 2 :(得分:0)

可能会因为反向迭代以避免索引问题。尝试这样的事情:

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);
  }
}

答案 3 :(得分:0)

确实不建议使用for循环来删除元素。考虑有两个连续的字符串,两个字符串都包含“yago”。它将删除第一个,递增i并跳过第二个字符串(因为它现在具有第一个字符串的索引)。

尝试使用while循环,只有在不删除元素时才增加(或者,如果你讨厌分支,则将for循环从大到小反转)。

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

答案 4 :(得分:0)

我没有看到你的语法/逻辑有什么问题。但是,条件可能

!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=0;i<classes.size();i++){
     if(!classes.get(i).contains("yago")){

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

我希望你觉得这很有用。

答案 5 :(得分:0)

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

for(int i=0; i<classes.size(); i++){
    if(classes.get(i).contains("yago")){
        classes.remove(i);
    }
}

这种方法的问题在于,当您从列表中删除元素时,您需要更改它的大小。您可以改为创建一个空的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);
}