2011-07-18 165 views
0

我有一個字符串數組列表,我想刪除字符串低於一定的長度。我在想這個方法:過濾字符串ArrayList

 for (int i = 0; i < result.size(); i++) { 
      if (result.get(i).split("\\s").length != maxLength) { 
       System.out.println(result.get(i)); 
       result.remove(i); 
} 
     } 

但它只是刪除幾個條目,因爲當它消除了一個那麼它在移動刪除了一個的地方下一個。有什麼其他辦法做到這一點

+0

你到底想幹什麼?您正在測試由字符「\ s」分隔的字符串返回的數組長度。我沒有看到你的字符串列表,但我期望測試語句總是評估1!= maxLength。 – Zach

回答

3

決不在這樣一個ArrayList中刪除。改爲使用迭代器:

Iterator<String> stringIterator = result.iterator(); 
while (stringIterator.hasNext()) { 
    String string = stringIterator.next(); 
    if (string.split("\\s").length != maxLength) { 
     System.out.println(string); 
     stringIterator.remove(); 
    } 
} 
2

嘗試從最後迭代到第一:

for (int i = result.size() - 1; i >= 0; i--) { 
     if (result.get(i).split("\\s").length != maxLength) { 
      System.out.println(result.get(i)); 
      result.remove(i); 
     } 
    } 
2

當你刪除一個,你應該遞減指標考慮到了那些下面已經轉移,如result.remove(i--);

+0

它的傳統,在所有節目,只是從末尾向後走。 – Fattie

1

您需要再次修改i以確保它覆蓋了數組列表的完整序列,或者按照其他答案中所示的順序返回last-> first。

for (int i = 0; i < result.size(); i++) { 
    if (result.get(i).split("\\s").length != maxLength) { 
     result.remove(i); 
     i--; // everything has been moved up in the arraylist 
    } 
} 

而且,花費的ArrayList線性的時間來刪除單個元件,如此反覆去除是一個好主意。

要麼使用LinkedList,它可以在迭代過程中在常量時間內移除,或者首先收集HashSet中的元素,然後使用Collection.removeAll(Collection)在最後刪除它們。

對於ArrayList,removeAll方法花費與列表大小成比例的時間乘以參數集合的查找時間。使用HashSet作爲參數應該儘量減少所花費的時間。

如果你只刪除了一些值,任何集合都可能就足夠了。

LinkedList tmpLinkedList = new LinkedList(result); 
for (Iterator iter = tmpLinkedList.iterator(); iter.hasNext() { 
    if (iter.next().split("\\s").length != maxLength)) 
     iter.remove(); 
} 
result.clear(); 
result.addAll(tmpLinkedList); 

或者:

HashSet toRemove = new HashSet(); 
//for (Iterator iter = myarraylist.iterator(); iter.hasNext() { 
for (String s : result) { 
    if (s.split("\\s").length != maxLength) 
     toRemove.add(elem); 
} 
result.removeAll(toRemove); 
3

使用迭代器,例如:

final Iterator<String> x = list.iterator(); 
while (iterator.hasNext()) { 
    if (someCondition) { 
     iterator.remove(); 
    } 
} 
1

您需要從最後開始,前往前方。

for (int i = result.size() - 1; i >= 0; i--) { 
    if (result.get(i).length < maxLength) { 
     System.out.println(result.get(i)); 
     result.remove(i); 
    } 
} 
1

要從集合中移除元素,您應該使用迭代器。

for (Iterator<String> iter = list.iterator(); iter.hasNext();) { 
     String s = iter.next(); 
     if (s.split("\\s").length != maxLength) { 
     iter.remove(); 
     } 
     else { 
     System.out.println(s); 
     } 
    } 
3

如果你碰巧使用Commons Collections

CollectionUtils.filter(result, new Predicate() 
{ 
    @Override 
    public boolean evaluate(Object object) 
    { 
     return ((String) object).split("\\s").length >= maxLength; 
    } 
}));