सेट <T> को सूची <T> में बदलने का अधिकांश संक्षिप्त तरीका


201

उदाहरण के लिए, मैं वर्तमान में यह कर रहा हूं:

Set<String> setOfTopicAuthors = ....

List<String> list = Arrays.asList( 
    setOfTopicAuthors.toArray( new String[0] ) );

क्या आप इसे हरा सकते हैं?


2
उपयोग करें java.util.Collection: O (0)
टिम

@ कार्ल, मुझे सेट को एक 3 पार्टी इंटरफ़ेस में प्रस्तुत करना होगा जिसमें एक सूची की आवश्यकता होती है। @ मुझे लगता है कि मैं संग्रह का उपयोग करने के लिए तीसरे पक्ष के इंटरफ़ेस को बदल सकता हूं।
जैक्स रेने मेसरीन

1
समझा; किसी भी अजीब बाधाओं को छोड़कर, मैं रोजर के जवाब के साथ जाऊंगा। हालाँकि, जब तक आप वास्तव में सूची का फिर से उपयोग नहीं करते हैं, तब तक मैं इसे कुछ भी निर्दिष्ट नहीं करूंगा (यानी, foo.api (सूची सूची) के बजाय foo.api (नए ArrayList <string> (listOfTopicAuthors)) का उपयोग करें)।
कार्ल

2
@ JacquesRenéMesrine: प्रश्न में कोड की पहली पंक्ति भ्रामक है: अपेक्षित: Set<String> setOfTopicAuthors = ....वास्तविक:Set<String> listOfTopicAuthors = ....
realPK

या ऐसा करने का एक वैकल्पिक तरीका List<String> list = Arrays.asList(setOfTopicAuthors.toArray(String[]::new))लिंक किए गए उत्तर में विस्तृत हो सकता है ।
नमन

जवाबों:


432
List<String> list = new ArrayList<String>(listOfTopicAuthors);

1
... और इस प्रकार जावा कोड सम्मेलनों को मौलिक रूप से धता बताया: oracle.com/technetwork/java/javase/documentation ! ...! :) :)
होवार्ड गीथस

इसके बाद जब मैंने सूची तत्व तक पहुँचने की कोशिश की तो मुझे त्रुटि देते हुए कहा, "java.lang.ClassCastException: java.lang.Integer को java.lang.String" में नहीं डाला जा सकता है। (int) यह बात है ... कोई सुझाव?
CoDe

2
मेरा मानना ​​है कि जावा 7 और इसके बाद के संस्करण में आप ArrayListपैदावार के प्रकार पैरामीटर को छोड़ सकते हैं : List<String> l = new ArrayList<>(listOfTopicAuthors); बाहरी पुस्तकालय का उपयोग किए बिना सबसे संक्षिप्त?
ब्रेट डनकॉज

यह NullPointerException को फेंक देगा, यदि listOfTopicAuthorsयह शून्य है।
w35l3y

91
List<String> l = new ArrayList<String>(listOfTopicAuthors);

4
एक ही मिनट में जवाब देने के लिए स्वीकार किए जाते हैं और क्रेडिट नहीं मिल रहा है। +1
jayeffkay

@ एड्स्की मैं एक सूची के साथ समाप्त करता हूं, जिसका सूचकांक 0 के बजाय 1 पर शुरू होता है, कोई उपाय?
जैक

1
@ जैक: यह निश्चित रूप से मामला नहीं होगा। Java.util से जावाडॉक से। लिस्ट: "सूचियाँ (जैसे जावा सरणियाँ) शून्य आधारित हैं।"
एडम्सकी

@ Adamski प्रतिक्रिया के लिए धन्यवाद। मुझे पता है कि सूचियां होनी चाहिए और शून्य आधारित हैं यही वजह है कि यह मेरे लिए बहुत अजीब है। अपने सेट को एक सूची में परिवर्तित करने के बाद, मैं उस पर कोई पुनरावृत्ति ऑपरेशन नहीं कर सकता, जैसे कि मैं, मुझे एक NullPointerException मिलता है, हालांकि जब मुझे उम्मीद है कि मेरी सूची में कोई भी तत्व शून्य नहीं है, और एकमात्र अजीब बात यह है कि मैं नोटिस कर रहा हूं सूचकांक 1 से शुरू होता है। हालाँकि, अगर मैं सामान्य सूची बनाता हूं तो सूचकांक 0. से शुरू होता है?
जैक

1
@ जैक: यह बहुत अजीब लगता है। यदि आप अपना कोड एक अलग प्रश्न के रूप में पोस्ट करते हैं, तो मुझे यकीन है कि कोई आपकी सहायता करने में सक्षम होगा।
एडम्सकी

23

यह देखते हुए कि हमारे पास Set<String> stringSetनिम्नलिखित हैं:

जावा 10 (अपरिवर्तनीय सूची)

List<String> strList = stringSet.stream().collect(Collectors.toUnmodifiableList());

जावा 8 (परिवर्तनीय सूची)

import static java.util.stream.Collectors.*;
List<String> stringList1 = stringSet.stream().collect(toList());

विधि के लिए डॉक्टर के अनुसारtoList()

लौटाए गए सूची के प्रकार, परिवर्तनशीलता, क्रमबद्धता या थ्रेड-सुरक्षा पर कोई गारंटी नहीं है; यदि लौटी हुई सूची पर अधिक नियंत्रण की आवश्यकता है, तोCollection (आपूर्तिकर्ता) का उपयोग करें।

इसलिए अगर हमें एक विशिष्ट कार्यान्वयन की आवश्यकता है जैसे ArrayListहम इसे इस तरह प्राप्त कर सकते हैं:

List<String> stringList2 = stringSet.stream().
                              collect(toCollection(ArrayList::new));

जावा 8 (गैर-सूचीबद्ध सूचियाँ)

हम Collections::unmodifiableListविधि का उपयोग कर सकते हैं और पिछले उदाहरणों में दी गई सूची को लपेट सकते हैं। हम अपनी स्वयं की कस्टम विधि भी लिख सकते हैं:

class ImmutableCollector {
    public static <T> Collector<T, List<T>, List<T>> toImmutableList(Supplier<List<T>> supplier) {
            return Collector.of( supplier, List::add, (left, right) -> {
                        left.addAll(right);
                        return left;
                    }, Collections::unmodifiableList);
        }
}

और फिर इसका उपयोग करें:

List<String> stringList3 = stringSet.stream()
             .collect(ImmutableCollector.toImmutableList(ArrayList::new)); 

एक अन्य संभावना यह है कि collectingAndThenविधि का उपयोग किया जाए जो परिणाम लौटने से पहले कुछ अंतिम परिवर्तन करने की अनुमति देता है:

    List<String> stringList4 = stringSet.stream().collect(collectingAndThen(
      toCollection(ArrayList::new),Collections::unmodifiableList));

एक टिप्पणी को इंगित करें कि विधि है Collections::unmodifiableListनिर्दिष्ट सूची का एक unmodifiable दृश्य देता है, के अनुसार दस्तावेज़ । एक unmodifiable दृश्य संग्रह एक संग्रह है जो unmodifiable है और एक बैकिंग संग्रह पर एक दृश्य भी है। ध्यान दें कि बैकिंग संग्रह में परिवर्तन अभी भी संभव हो सकता है, और यदि वे होते हैं, तो वे असम्बद्ध दृश्य के माध्यम से दिखाई देते हैं। लेकिन कलेक्टर विधि जावा 10Collectors.unmodifiableList में सही मायने में अपरिवर्तनीय सूची देती है ।


मैंने इसका उपयोग ए में कन्वर्ट करने के Set<Double>लिए किया List<Double, जहां सेट एक LinkedHashMap' .keySet()विधि से आया था । एक्लिप्स ने मुझे बताया कि एक प्रकार का बेमेल था, और मैं इससे परिवर्तित नहीं कर सकता Objectथा List<Double>। क्या आप मुझे बता सकते हैं कि ऐसा क्यों हुआ होगा? मैं कास्टिंग करके इसके चारों ओर आ गया, लेकिन मैं सोच रहा था कि ऐसा क्यों होता है।
अनगेहेउर

1
हां, चूंकि जावा डेवलपर्स को अधिक से अधिक जावा 8 सुविधाओं का उपयोग करना चाहिए, इसलिए यह उत्तर उपरोक्त 2 उत्तरों से बेहतर है।
शुभम पांडे

13

सेट के लिए यह कोशिश करें :

Set<String> listOfTopicAuthors = .....
List<String> setList = new ArrayList<String>(listOfTopicAuthors); 

मानचित्र के लिए इसे आज़माएँ :

Map<String, String> listOfTopicAuthors = .....
// List of values:
List<String> mapValueList = new ArrayList<String>(listOfTopicAuthors.values());
// List of keys:
List<String> mapKeyList = new ArrayList<String>(listOfTopicAuthors.KeySet());

2

यदि आप अमरूद का उपयोग कर रहे हैं, तो आप सूची वर्ग newArrayListसे सांख्यिकीय रूप से आयात विधि :

List<String> l = newArrayList(setOfAuthors);

0

वास्तव में यकीन नहीं है कि आप अपने कोड के संदर्भ में क्या कर रहे हैं लेकिन ...

क्यों listOfTopicAuthorsचर बनाने के लिए ?

List<String> list = Arrays.asList((....).toArray( new String[0] ) );

"...." दर्शाता है कि आपका सेट खेल में आया है, चाहे वह नया हो या किसी अन्य स्थान से आया हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.