2011-07-18 8 views
0

私は文字列の配列リストを持っており、ある長さ以下の文字列を削除したいと思います。私はこの方法を考えていた:文字列の配列リストをフィルタリングする

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

しかし、それは、その後1を削除するときに削除さ1の代わりに、次のいずれかをシフトしているため、それはほんの数のエントリを削除しています。

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

が最初に最後の繰り返しを試してみてくださいことを行うための他の方法は何ですかresult.remove(i--);

2

あなたは1を削除するときは、以下のものがのように、シフトしていることを考慮に入れるためにインデックスをデクリメントする必要があります

+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は1つの要素を削除するために線形時間を要します。したがって、繰り返しの削除は悪い考えです。

繰り返し処理中に一定時間内に削除できる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; 
    } 
})); 
関連する問題