簡體   English   中英

元素未從ArrayList中刪除

[英]Elements are not being removed from 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);
      }

但是沒有運氣

首先,刪除“!” 在您的第二個代碼if(!classes.get(i).contains("yago")) ,我認為它應該工作。 如果不行,請提供一些ClassesRetrieval.getYagoClasses();基本代碼ClassesRetrieval.getYagoClasses(); , 請。

我在自己創建的列表上測試了您的第一個代碼。 它起作用了,但是如果您要刪除不包含“ 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);
  }

此后可能要進行反向迭代以避免索引問題。 嘗試這樣的事情:

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循環來刪除元素。 考慮具有兩個連續的字符串,兩個字符串都包含“ 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=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,並在不遵守條件的情況下繼續向其中添加新元素:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM