2011-08-05 6 views
2

1000以上のサイズのリストをフィルタリングし、そこからサブリストを取得する必要があります。 イテレータを使いたくありません。イテレータを使用しないフィルタリングリスト

1)現在、私はリストを繰り返し、Javaを使って比較しています。これは時間のかかる作業です。私は自分のコードのパフォーマンスを向上させる必要があります。

2)私もGoogle Collections(Guava)を使用しようとしましたが、バックグラウンドでも繰り返すと思います。

Predicate<String> validList = new Predicate<String>(){ 
     public boolean apply(String aid){ 
      return aid.contains("1_15_12"); 
     } 
    }; 
    Collection<String> finalList =com.google.common.collect.Collections2.filter(Collection,validList); 

誰も私が反復することなく、サブリストより速く得ることができたり、イテレータを使用している場合、私は比較的速くなりますでしょうか、私を提案することができます。

+5

1000はあまり大きな数値ではありません。それはシーケンシャルアクセスのリストであり、反復は避けられないものです。 – Nivas

+1

各要素をチェックする必要があるので、フィルタリングの際にはイテレータは避けられないと思います。 –

+0

@Nivas:あなたのコメントは答えが –

答えて

0

リストは、オブジェクトの順序付けられたコレクションです。だから、それをフィルタリングするために反復する必要があります。

+0

申し訳ありませんが、Nivasは既に質問に答えました... – never

2

あなたのサブリストにsize()と電話をかけるとどうなるか考えてみましょう。すべての要素が結果を変更する可能性があるので、にはすべての要素をチェックするのにがあります。あなたがなどのランダムアクセスを使用していない、それにすべての要素には触れないことを意味あなたのリストを使用しての非常に特殊な方法を持っている場合は

は、おそらくあなたは、すべてのListインタフェースを望んでいません。あなたがしていることについてもっと教えていただければ、本当に助けになるでしょう。

+0

良いコメント、悪い回答。 –

+0

@Gabriel:私はそれは*答えだと思います。リストの一般的なインターフェースが必要な場合、リスト全体を反復するよりもうまくやることができません。もし彼が 'List'インターフェース全体を必要としないなら、反復せずに実行可能な別のインターフェースを使うことができます。 –

+0

理論的には完全に真実ではありません。使用方法によっては、List with Constraintsを使用したり、特定の順序でリストに追加したりすることができます。これにより、Collection全体を繰り返し処理する必要がなくなります。しかし、それは、私はそのような答えを与えることはありません、彼は彼の問題の解決策を与えるために、より多くの情報とその後の答えを得るためにコメントをするだろう、これが主観的なので、私はダウンボートを取り戻す(編集する場合)。 –

0

私は自分のコメントを豊かにします: 各要素をチェックする必要があるので、フィルタリング中にイテレータが不可避であると思います。

Collections2.filterについては、単純なフィルタとは異なります。返されたCollectionは、依然として「条件付き」です。つまり、満足していない要素がCollectionに追加された場合は、IllegalArgumentExceptionがスローされます。

0

パフォーマンスが本当に懸念される場合、ほとんどの場合、述語はかなり遅いです。あなたができることはLists.partitionにあなたのリストを並べ替えることです(これを書く必要があります)。次に結果を連結します。

問題を解決するにはより良い方法があるかもしれませんが、リスト内の述語とデータに関する詳細情報が必要です。

関連する問題