มีนักสะสมที่รวบรวมไปยังชุดรักษาคำสั่งซื้อหรือไม่?


107

Collectors.toSet()ไม่รักษาระเบียบ ฉันสามารถใช้ Lists แทนได้ แต่ฉันต้องการระบุว่าคอลเล็กชันผลลัพธ์ไม่อนุญาตให้มีการทำซ้ำองค์ประกอบซึ่งเป็นSetอินเทอร์เฟซสำหรับอะไร


ฉันไม่คิดว่าสิ่งนี้มีอยู่จริง ฉันรู้ว่าฉันต้องการมันด้วยและฉันก็ต้องเขียนของตัวเอง
markspace

จะSortedSetทำงาน? ถ้าไม่กำหนดเองเป็นวิธีที่จะไป
AntonH

@AntonH ไม่ฉันต้องการการดำเนินการ O (1) กับ O (log n)
gvlasov

1
ฉันโพสต์รหัสนั้นไม่ใช่สิ่งที่คุณต้องการ แต่อาจช่วยให้คุณเริ่มต้นได้
markspace

คำตอบ:


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

@Susei ฉันจะพยายามดูมัน อีกทางเลือกหนึ่งคือส่งคืนชุดที่ไม่สามารถปรับเปลี่ยนได้ เช่น:Set<String> linkedSet = list.stream().collect(Collectors.toCollection(LinkedHashSet::new)); linkedSet = Collections.unmodifiableSet(linkedSet);
Alexis C.

@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.