অর্ডার-সংরক্ষণের সেটটিতে সংগ্রহকারী কোনও সংগ্রাহক আছেন কি?


107

Collectors.toSet()অর্ডার সংরক্ষণ করে না আমি পরিবর্তে তালিকাগুলি ব্যবহার করতে পারি, তবে আমি এটি নির্দেশ করতে চাই যে ফলস্বরূপ সংগ্রহটি উপাদান নকল করতে দেয় না, যা Setইন্টারফেসের জন্য ঠিক তাই ।


আমি মনে করি না যে এ জাতীয় একটি জিনিস রয়েছে। আমি জানি আমারও খুব দরকার ছিল এবং আমাকে নিজের লেখাও ছিল।
মার্কস্পেস

চান SortedSetকাজ করে? যদি তা না হয় তবে কাস্টম হ'ল উপায়।
আন্তোনহ

@ অ্যান্টনএইচ না, আমি ও (লগ এন) এর চেয়ে ও (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()যে ক্ষেত্রে।
gvlasov

@ সুসেই আমি এটি দেখার চেষ্টা করব। একটি বিকল্প হ'ল অশোধিত সেটটি ফেরত দেওয়া। উদা: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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.