Sipariş koruma Setine toplayan bir Kollektör var mı?


107

Collectors.toSet()düzeni korumaz. Bunun yerine Listeleri kullanabilirim, ancak ortaya çıkan koleksiyonun öğe yinelemesine izin vermediğini belirtmek istiyorum, bu tam olarak Setarabirim içindir.


Böyle bir şeyin var olduğunu sanmıyorum. Benim de ihtiyacım olduğunu biliyorum ve kendi yazmam gerekiyordu.
markspace

Çalışır mıydı SortedSet? Değilse, gitmenin yolu özeldir.
AntonH

@AntonH Hayır, O (1) işlemlerini O (log n) olarak tercih ederim.
gvlasov

1
O kodu gönderdim, tam olarak ihtiyacınız olan şey bu değil ama başlamanıza yardımcı olabilir.
markspace

Yanıtlar:


203

İstediğiniz toCollectionsetin somut örneğini kullanabilir ve sağlayabilirsiniz. Örneğin, kampanya siparişini korumak istiyorsanız:

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

Örneğin:

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]
    }
}

Güzel, tam da ihtiyacım olan şey bu, ama Guava'nın ImmutableSetbenim durumumda daha da iyi olacağını düşünüyorum . Nasıl koleksiyoner yapabileceğime dair bir fikriniz var ImmutableSetmı? Örnekleri, ImmutableSet.Buildera olmayan bir ile oluşturulmuştur Collection, bu nedenle bu durumda nasıl Supplierfor Collectors.toCollection()yapacağınızı anlayamıyorum.
gvlasov

@Susei Ona bakmaya çalışacağım. Bir alternatif, değiştirilemez bir küme döndürmektir. Ör:Set<String> linkedSet = list.stream().collect(Collectors.toCollection(LinkedHashSet::new)); linkedSet = Collections.unmodifiableSet(linkedSet);
Alexis C.

@Susei Bulduğum en yakın şey: Set<String> set = list.stream().collect( ImmutableSet.Builder<String>::new, ImmutableSet.Builder<String>::add, (builder1, builder2) -> builder1.addAll(builder2.build())).build();Ortaya çıkan seti ile sararak daha iyi bir yaklaşım olup olmadığından emin değilim Collections.unmodifiableSet.
Alexis C.

Zaten konu dışı olduğu için (ve tabii ki harika cevaplar için daha fazla temsilci için) özel bir soru var: stackoverflow.com/questions/27612165/…
gvlasov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.