注文を保存するセットに収集するコレクターはありますか?


107

Collectors.toSet()順序は保持されません。代わりにリストを使用することもできますが、結果のコレクションでは要素の複製が許可されないことを示したいと思いSetます。これがまさにインターフェースの目的です。


そんなことはないと思います。私も必要だったので、自分で書く必要がありました。
マークスペース2014

うまくいくでしょうSortedSetか?そうでない場合は、カスタムが進むべき道です。
AntonH 2014

@AntonHいいえ、私はO(log n)よりもO(1)演算を好みます。
gvlasov

1
私はそのコードを投稿しました、それはあなたが正確に必要とするものではありませんがそれはあなたを始めるかもしれません。
マークスペース2014

回答:


203

toCollection必要なセットの具体的なインスタンスを使用して提供できます。たとえば、挿入順序を維持したい場合:

Set<MyClass> set = myStream.collect(Collectors.toCollection(LinkedHashSet::new));

例えば:

public class Test {    
    public static final void main(String[] args) {
        List<String> list = Arrays.asList("b", "c", "a");

        Set<String> linkedSet = 
            list.stream().collect(Collectors.toCollection(LinkedHashSet::new));

        Set<String> collectorToSet = 
            list.stream().collect(Collectors.toSet());

        System.out.println(linkedSet); //[b, c, a]
        System.out.println(collectorToSet); //[a, b, c]
    }
}

いいですね、それがまさに私が必要ImmutableSetとしていることですが、私の場合はグアバがもっと良いと思います。私が収集するコレクターをどのように作ることができるかについてのアイデアはありますImmutableSetか?そのインスタンスがで構築されていますImmutableSet.BuilderされていないCollectionので、私はあなたが作るだろう方法を見つけ出すことができないSupplierためCollectors.toCollection()、その場合インチ
gvlasov 14

@Susei調べてみます。別の方法は、変更不可能なセットを返すことです。例:Set<String> linkedSet = list.stream().collect(Collectors.toCollection(LinkedHashSet::new)); linkedSet = Collections.unmodifiableSet(linkedSet);
Alexis

@Susei私が見つけた最も近いもの:Set<String> set = list.stream().collect( ImmutableSet.Builder<String>::new, ImmutableSet.Builder<String>::add, (builder1, builder2) -> builder1.addAll(builder2.build())).build();結果セットをでラップすることによるより良いアプローチであるかどうかはわかりませんCollections.unmodifiableSet
Alexis C.

それは(もちろん、偉大な答えのためのより多くの担当者のための)オフトピックすでにますので、ここでは、専用の質問です:stackoverflow.com/questions/27612165/...
gvlasovは
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.