सरणी से उत्परिवर्तनीय सूची बनाएं?


85

मेरे पास एक ऐसा सरणी है जिसे मैं सरणी Listकी सामग्री को संशोधित करने के लिए एक में बदलना चाहता हूं ।

स्टैक ओवरफ़्लो प्रश्न / उत्तर के बहुत सारे है कि पता है Arrays.asList()और कैसे यह केवल अंतर्निहित सरणी की एक सूची दृश्य प्रदान करता है, और कैसे जिसके परिणामस्वरूप सूची में हेरफेर करने का प्रयास आम तौर पर फेंक देते हैं एक UnsupportedOperationExceptionसूची में हेरफेर करने (जैसे इस्तेमाल किया तरीकों के रूप में add(), remove(), आदि) द्वारा प्रदान की गई सूची कार्यान्वयन द्वारा लागू नहीं किया गया Arrays.asList()

लेकिन एक सारणी को एक उत्परिवर्तनीय सूची में कैसे बदलना है, इसका उदाहरण मुझे नहीं मिला। मुझे लगता है कि मैं सरणी और put()प्रत्येक मान के माध्यम से एक नई सूची में लूप कर सकता हूं , लेकिन मैं सोच रहा हूं कि क्या कोई इंटरफ़ेस है जो मेरे लिए ऐसा करने के लिए मौजूद है।

जवाबों:


122

एक सरल तरीका:

Foo[] array = ...;
List<Foo> list = new ArrayList<Foo>(Arrays.asList(array));

यह एक परिवर्तनशील सूची बनाएगा - लेकिन यह मूल सरणी की एक प्रति होगी । सूची बदलने से सरणी नहीं बदलेगी। आप इसे बाद में कॉपी कर सकते हैं, ज़ाहिर है, का उपयोग करके toArray

यदि आप किसी सरणी पर एक परिवर्तनशील दृश्य बनाना चाहते हैं , तो मेरा मानना ​​है कि आपको इसे स्वयं लागू करना होगा।


2
Arrays.asList एक सरणी पर एक दृश्य देता है, उन उत्परिवर्ती तरीकों का समर्थन करता है जो सूची के आकार को प्रभावित नहीं करते हैं
टिमो वेस्टकम्प्टर

1
@ jon-skeet मुझे पता है, मैं सिर्फ यह कह रहा था कि Arrays.asList आपको सीमित परिवर्तनशीलता के साथ एक सरणी समर्थित सूची देता है, अगर आपको ऐड / रिमूव / इंसर्ट की जरूरत है तो ArrayList रैपिंग एक बेहतर तरीका है।
टिमो वेस्टकमर

4
जावा को इन सभी स्थिर कारखाने विधियों में परिवर्तनशीलता / अपरिवर्तनीयता स्पष्ट करने की आवश्यकता है। यह पता लगाने के लिए कि आपने रनटाइम में एक अपरिवर्तनीय चीज बनाई है।
डस्टीवन

1
@ डस्टाइनवन: प्रलेखन बहुत स्पष्ट है आईएमओ: "निर्दिष्ट सरणी द्वारा समर्थित एक निश्चित आकार की सूची लौटाता है (लौटी सूची में परिवर्तन" सरणी के माध्यम से "लिखें")
जॉन स्कीट

1
@JonSkeet अपना समय बर्बाद नहीं करना चाहते हैं - आप सभी के लिए धन्यवाद। मैं स्वयं नामों में अधिक स्पष्टता के लिए वोट डालना चाहूंगा - मुझे यकीन है कि डॉक्स स्पष्ट हैं। हम में से कुछ भाषाओं के बीच नृत्य कर रहे हैं, और यह अन्य भाषाओं में यथोचित रूप से स्पष्ट है।
डस्टीवन

23

और अगर आप google संग्रह API (Guava) का उपयोग कर रहे हैं:

Lists.newArrayList(myArray);

1
यह सबसे संक्षिप्त जवाब है। धन्यवाद।
यूजीन e२

2
यहां तक ​​कि स्वयं अमरूद भी या तो उपयोग करने की सलाह देते हैं new ArrayList<>(Arrays.asList(...))- विधि के लिए जावाडॉक का तात्पर्य है कि यह पदावनत हो जाएगा क्योंकि यह पर्याप्त उपयोगी नहीं है।
लोगन पिकअप

1
2020 और अभी भी नहीं निकाला गया। में कूदो!
मार्क

13

जावा 8 में शामिल स्ट्रीम एपीआई का उपयोग करने वाला यह सरल कोड आपके सरणी के तत्वों से युक्त एक परिवर्तनशील सूची (या दृश्य) बनाता है:

Foo[] array = ...;
List<Foo> list = Stream.of(array).collect(Collectors.toCollection(ArrayList::new));

या, समान रूप से मान्य:

List<Foo> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));

4

यदि आप ग्रहण संग्रह (पूर्व में जीएस संग्रह ) का उपयोग कर रहे हैं , तो आप उपयोग FastList.newListWith(...)या कर सकते हैं FastList.wrapCopy(...)

दोनों विधियाँ varargs लेती हैं, जिससे आप सरणी इनलाइन बना सकते हैं या किसी मौजूदा सरणी में पास कर सकते हैं।

MutableList<Integer> list1 = FastList.newListWith(1, 2, 3, 4);

Integer[] array2 = {1, 2, 3, 4};
MutableList<Integer> list2 = FastList.newListWith(array2);

दो तरीकों के बीच का अंतर यह है कि सरणी कॉपी की जाती है या नहीं। newListWith()सरणी की प्रतिलिपि नहीं बनाता है और इस प्रकार निरंतर समय लेता है। यदि आपको पता है कि सरणी को कहीं और म्यूट किया जा सकता है तो आपको इसका उपयोग करने से बचना चाहिए।

Integer[] array2 = {1, 2, 3, 4};
MutableList<Integer> list2 = FastList.newListWith(array2);
array2[1] = 5;
Assert.assertEquals(FastList.newListWith(1, 5, 3, 4), list2);

Integer[] array3 = {1, 2, 3, 4};
MutableList<Integer> list3 = FastList.wrapCopy(array3);
array3[1] = 5;
Assert.assertEquals(FastList.newListWith(1, 2, 3, 4), list3);

नोट: मैं ग्रहण संग्रहों के लिए एक कमिटेटर हूं।


1
यह एक अच्छा संग्रह एपीआई है जो आपको वहां मिला है। पहले जो मैंने देखा है वह मुझे अपने स्वयं के कार्यान्वयन से दूर कर सकता है ... केवल यह याद आ रहा है कि मुझे आमतौर पर उपयोगी लगता है एक सरणी द्वारा समर्थित सॉर्ट सेट कार्यान्वयन है (जो मुझे लगता है कि एक से अधिक कुशल है पेड़-आधारित कार्यान्वयन या तो डेटा के लिए जो कि शायद ही कभी संशोधित किया जाता है या ऐसे सेटों के लिए जिन्हें अक्सर संशोधित किया जा सकता है, लेकिन आम तौर पर 10 या उससे कम तत्वों को रखा जाता है)।
जूल्स

0
myNewArrayList = new ArrayList<>(Arrays.asList(myArray));

1
@JonSkeet मुझे पता है कि आपकी टिप्पणी 2012 की है, और मैं भविष्य में अब भी हूँ, लेकिन मैं इस टिप्पणी को अच्छी तरह से अपनी आईडीई को विशेष रूप से रेखांकित करता हुआ नहीं मानता और कहता हूँ "अरे, यह मत घोषित करो घोषित प्रकार। आपको वहां इसकी आवश्यकता नहीं है "?
ब्रेंट थोनीन

1
@BrentThoenen: मुझे आपकी टिप्पणी समझ में नहीं आती। क्या आपने देखा कि मेरी टिप्पणी में संशोधन 1 का उल्लेख किया गया था, जिसका उपयोग किया गया था myNewArrayList = new ArrayList(...), यानी कच्चा प्रकार? "डायमंड ऑपरेटर के उपयोग से संकलक को एक प्रकार का तर्क देने" और "एक कच्चे प्रकार का उपयोग करने" के बीच अंतर होता है।
जॉन स्कीट

1
मैंने इस उत्तर को पोस्ट किया और इस समय गुमनामी में जी रहा था कि @JonSkeet ने स्वयं मेरे उत्तर पर टिप्पणी की। टिप्पणी करने के लिए धन्यवाद ब्रेंट।
सिड

@JonSkeet आह, मेरा बुरा। मैं उस संशोधन की जाँच नहीं कर रहा था जिस पर आप टिप्पणी कर रहे थे। मैंने गलत धारणा बनाई कि 2012 जावा ने खाली हीरे के ऑपरेटर को कच्चे प्रकार के रूप में मान लिया। वह मेरा बी है। जवाब के लिए धन्यवाद!
ब्रेंट थोनेन जूल

0

स्ट्रीम API का उपयोग करके एक और विकल्प जोड़ना:

List<Foo> list = Arrays.stream(array).collect(Collectors.toList());

2
आपके समाधान के साथ समस्या यह है कि कलेक्टर # tolist में परिवर्तनशीलता की कोई गारंटी नहीं है , और इसलिए यह आवश्यकताओं के अनुरूप नहीं है।
MikaelF
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.