क्या कोई कलेक्टर है जो एक ऑर्डर-प्रोटेक्शन सेट को इकट्ठा करता है?


107

Collectors.toSet()आदेश को संरक्षित नहीं करता है। मैं इसके बजाय सूचियों का उपयोग कर सकता हूं, लेकिन मैं यह संकेत करना चाहता हूं कि परिणामस्वरूप संग्रह तत्व दोहराव की अनुमति नहीं देता है, जो कि वास्तव में Setइंटरफ़ेस के लिए है।


मुझे नहीं लगता कि ऐसी कोई चीज मौजूद है। मुझे पता है कि मुझे एक की भी जरूरत थी, और मुझे अपना खुद का लिखना था।
मार्कस्पेस

चाहेंगे SortedSetकाम करते हैं? यदि नहीं, तो कस्टम जाने का रास्ता है।
एंटोनएच

@AntonH नहीं, मैं O (1) ओ (लॉग एन) के संचालन को प्राथमिकता दूंगा।
gvlasov

1
मैंने उस कोड को पोस्ट किया है, यह वही नहीं है जिसकी आपको आवश्यकता है लेकिन यह आपको आरंभ कर सकता है।
मार्कस्पेस

जवाबों:


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()उस मामले में।
ग्वलासोव

@Susei मैं इसे देखने की कोशिश करूँगा। एक विकल्प एक अमिट सेट को वापस करने के लिए होगा। पूर्व:Set<String> linkedSet = list.stream().collect(Collectors.toCollection(LinkedHashSet::new)); linkedSet = Collections.unmodifiableSet(linkedSet);
एलेक्सिस सी।

@ सुसी ने मुझे सबसे करीब पाया: Set<String> set = list.stream().collect( ImmutableSet.Builder<String>::new, ImmutableSet.Builder<String>::add, (builder1, builder2) -> builder1.addAll(builder2.build())).build();यह निश्चित नहीं है कि परिणामी सेट के साथ लपेटकर यह एक बेहतर तरीका है Collections.unmodifiableSet
एलेक्सिस सी।

यहाँ एक समर्पित प्रश्न है, क्योंकि यह पहले से ही विषय है (और महान उत्तरों के लिए अधिक प्रतिनिधि के लिए), stackoverflow.com/questions/27612165/…
gvlasov
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.