2016-12-05 3 views
2

私はファイルからの行のArrayListを持っています。Collection.removeIfが異常に機能します

1 1 13 25 25 
25 25 11 3 1 
25 25 13 1 1 

そして、私はリストから削除する必要がある場合、私は、私はこの行を必要とするかどうかをテストする機能テスト(String)を持っているか: ファイルは5つの数字で行が含まれています。 マイ試験方法:

static boolean test(String s){ 
     return list.contains(reverse(s)); 
} 

逆(文字列)は、逆の順序で記述された番号の行を返します。 1 1 13 25 25については、25 25 13 1 1が返されます。

したがって、Iteratorを使用してリストをループして要素を削除するコードを記述しました。

Iterator<String> iter = list.iterator(); 
while(iter.hasNext()){ 
    if(test(iter.next())) 
     iter.remove(); 
} 

このコードは正しく動作します。 しかし、IDEAによれば、このループはCollection.removeIf呼び出しで置き換えることができます。

list.removeIf(s->test(s)); 

しかし、それは私の空のリストを与える: だから、私はこのラインで上記のコードを交換しようとしました。どうして?違いはなんですか?

また、removeIfを使用して特定の文字を含む行を削除しようとしましたが、正しく動作します。 ここにすべてのプログラムが表示されます:http://pastebin.com/bWw3cBXg。一般的に悪い考えで、それを修正しながら、(その上にを呼び出すことによって)あなたは、リストを反復処理している

マイファイルhttp://pastebin.com/mEb5sBBJ(〜17000行)

+3

音が奇妙です。 *あなたがやっていることを見ているからです...それは有効なアプローチのようです。したがって、問題を再現するために使用できる小さな例を提供するためには、http://stackoverflow.com/help/mcveを調べることをお勧めします。 – GhostCat

+0

'test'メソッドを表示できますか? – GurV

+0

'test'メソッドのThx。私はまだ完全な例を見て実行したいと思います。 –

答えて

3

最初のアルゴリズムは、最初の行が反転されているかどうかをテストするためにテストします。その行を削除します。次に、最初の行がすでに削除されているので、2番目の行(現在は最初の行)を検査し、逆の行要素は見つけられません。

第2のアルゴリズムは異なります。リストを反復して、削除する必要のあるすべてのインデックスにマークを付けます。その後、それらはすべて削除されます。 2行目は1行目と同じです。三番目のものと同じです。だから最後はすべてが逆転している。

この動作はremoveIfには記載されていませんが、述部は冪等でなければならないという一般的な規約に準拠しています。リストの要素で述語を呼び出すと、すでにリストの別の要素が削除されているかどうかによって同じ値が返されません。

+1

それでも '25 25 11 3 1'を維持すべきですか? –

+0

あなたが記述した 'removeIf()'の動​​作を確認するクイックテストがありますが、ドキュメントから読み込めませんでした。確かにOPの例では、少なくともループよりも多くの要素を削除することが期待されます。 –

+0

@tobias_kはい、確かに。私はデータをあまりにも速く読んで、その線が第3の線と同じであると思った。しかし、この例のデータは空の結果が得られた実際のデータではないと思います。彼はまだ完全なテストケースを投稿していないので、知るのは難しいです。 –

関連する問題