1

私は多くのエントリを持つ大規模なコレクションを持っています:Set<File> allFiles

次のアルゴリズムを使用してこのセットを反復処理することは実用的ですか?それを行うためのより良い方法はありますか?

Set<File> allFiles = // ...100,000+ entries
Set<File> filteredList = new LinkedHashSet<File>();

FileNameExtensionFilter filter = new FileNameExtensionFilter("Extensions accepted", "a", "b", "c");

for (File file : allFiles) {
    if (filter.accept(file)) {
        filteredList.add(file);
    }
}

誰かが質問している場合、allFilesセットは他の場所に事前入力されており、必ずしもFile.listFiles()メソッドを使用して収集されるとは限りません。

4

3 に答える 3

4

実際には、Javaで5行で書き込み可能であることを意味する場合はそうです。リストをフィルタリングしたい場合(Scalaやそのフィルターメソッドのような機能構造を持つ言語とは対照的に)、よりクリーンな代替手段はありません。

個人的には、どうすればもっとうまくできるかわかりません。もしあなたのユースケースが本当に悪い拡張子のファイルを除外することであるなら、私はJavaでも同じことをするでしょう。

インターフェイスとクラスを使用する必要がない場合は、これらのクラスはどちらもまたは(英語のロケールに従ってファイル名を小文字に設定するため)javax.swingのみに依存するため、 fromと同じくらいクリーンです。大文字と小文字を区別しない拡張機能に従って実際にフィルタリングする場合は、間違いなくこの方法を使用する必要があります。私の日食で見られる唯一の代替手段は実装ですが、新しい依存関係があり、正規表現パターンを記述します。拡張機能。ですから 、これが本当にあなたのユースケースであるなら、私はとどまります。java.iojava.util.LocaleFilenameFilterjava.iocom.google.gwt.thirdparty.guava.common.io.PatternFilenameFilterjava.io.FilenameFilterFileNameExtensionFilter

于 2012-08-30T07:44:39.830 に答える
2

それがどのように非現実的であるかわかりません。Setの代わりにリストを繰り返して追加するよりもかなり遅くなることはありません(ただし、それでもわずかに高速で、使用するメモリも少なくなります)。ただし、セットを使用する正当な理由がある場合(たとえば、一意の要素が必要な場合や、メンバーシップのクエリを高速化する場合)は、大丈夫だと思います。

コードの残りの部分を見ずに言うのは難しいですが。自分でテストすることをお勧めします。

于 2012-08-30T07:44:29.427 に答える
0

他の人が示唆しているように、あなたはセットをフィルタリングするための適切な方法を持っています。私がする唯一の考えはCollectionUtils.html#filter、Apache Commonsを使用して、コードをより読みやすく、保守しやすくすることです。

于 2012-08-30T07:50:34.783 に答える