जावा में सूचीबद्ध करने के लिए सरणी परिवर्तित


1027

मैं किसी सरणी को जावा में सूची में कैसे बदलूं?

मैंने Arrays.asList()जावा एसई 1.4.2 (संग्रह में अब डॉक्स) से 8 में किसी भी तरह व्यवहार (और हस्ताक्षर) का इस्तेमाल किया और सबसे अधिक स्निपेट मैंने वेब पर पाया 1.4.2 व्यवहार का उपयोग करते हैं।

उदाहरण के लिए:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
  • 1.4.2 पर 1, 2, 3 तत्वों से युक्त एक सूची देता है
  • 1.5.0+ पर सरणी स्पैम युक्त सूची देता है

कई मामलों में इसका पता लगाना आसान होना चाहिए, लेकिन कभी-कभी यह किसी का ध्यान नहीं भटका सकता है:

Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);

20
मुझे लगता है कि आपका उदाहरण टूट गया है Arrays.asList(new int[] { 1, 2, 3 }):; निश्चित रूप से जावा 1.4.2 में संकलित नहीं किया था, क्योंकि एक int[]है नहीं एक Object[]
जोकिम सॉयर

1
ओह, आप सही हो सकते हैं। पोस्ट करने से पहले मेरे उदाहरण का परीक्षण करने के लिए मेरे पास जावा 1.4.2 कंपाइलर नहीं था। अब, आपकी टिप्पणी और जो के उत्तर के बाद, सब कुछ बहुत अधिक समझ में आता है।
अलेक्जेंड्रू

1
मैंने सोचा था कि ऑटोबॉक्सिंग ने आदिम से लेकर रैपर इंटगर वर्ग तक के रूपांतरण को कवर किया होगा। आप पहले कलाकारों को खुद बना सकते हैं और फिर Arrays.asListकाम करने के लिए उपरोक्त कोड चाहिए।
हॉर्स वॉयस

2
Java 8 की Stream.boxed () ऑटोबॉक्सिंग का ध्यान रखेगी और इसके लिए इस्तेमाल किया जा सकता है। नीचे मेरा जवाब देखें
इब्राहिम दुख

जावा 8 समाधान: stackoverflow.com/questions/2607289/…
akhil_mittal

जवाबों:


1430

आपके उदाहरण में, ऐसा इसलिए है क्योंकि आपके पास एक आदिम प्रकार की सूची नहीं हो सकती है। दूसरे शब्दों में, List<int>संभव नहीं है।

हालाँकि, आप List<Integer>उस Integerवर्ग का उपयोग कर सकते हैं जो intआदिम को लपेटता है । उपयोगिता विधि के Listसाथ अपने सरणी में परिवर्तित करें Arrays.asList

Integer[] spam = new Integer[] { 1, 2, 3 };
List<Integer> list = Arrays.asList(spam);

इस कोड को IdeOne.com पर लाइव देखें ।


112
या इससे भी सरल: Arrays.asList (1, 2, 3);
कांग

45
यह कैसे एक बनाने के लिए पता नहीं है List<Integer[]>?
थॉमस अहले

25
जावा 5+ में विफल।
djechlin

6
@ThomasAhle यह एक सूची नहीं बनाता है <Integer []> यह सूची <Integer> ऑब्जेक्ट बनाता है। और यदि आप सुरक्षित लिखना चाहते हैं, तो आप लिखें: Arrays। <Integer> asList (spam);
user1712376

6
@ThomasAhle यह एक अच्छा सवाल है। एक अनुमान यह जावा कंपाइलर में एक नियम है। उदाहरण के लिए निम्नलिखित कोड एक सूची देता है <Integer []> Integer[] integerArray1 = { 1 }; Integer[] integerArray2 = { 2 }; List<Integer[]> integerArrays = Arrays.asList(integerArray1, integerArray2);
शमौन

167

जावा 8 में, आप स्ट्रीम का उपयोग कर सकते हैं:

int[] spam = new int[] { 1, 2, 3 };
Arrays.stream(spam)
      .boxed()
      .collect(Collectors.toList());

यह अच्छा है, लेकिन यह काम नहीं करेगा boolean[]। मुझे लगता है कि क्योंकि यह सिर्फ एक बनाने के लिए आसान है Boolean[]। यह शायद एक बेहतर उपाय है। वैसे भी, यह एक दिलचस्प विचित्रता है।
ग्लेनपेटर्सन

138

रूपांतरण के तरीके के बारे में बोलते हुए, यह इस बात पर निर्भर करता है कि आपको अपनी आवश्यकता क्यों है List। यदि आपको केवल डेटा पढ़ने के लिए इसकी आवश्यकता है। ठीक अब तुम शुरु करो:

Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);

लेकिन तब अगर आप ऐसा कुछ करते हैं:

list.add(1);

आपको मिलता है java.lang.UnsupportedOperationException। तो कुछ मामलों के लिए आपको इसकी आवश्यकता है:

Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));

पहला दृष्टिकोण वास्तव में सरणी को परिवर्तित नहीं करता है, लेकिन इसे 'ए' की तरह दर्शाता है List। लेकिन सरणी अपने सभी गुणों के साथ हुड के नीचे है जैसे तत्वों की निश्चित संख्या। कृपया ध्यान दें कि आपको निर्माण करते समय टाइप निर्दिष्ट करना होगा ArrayList


1
"अपरिवर्तनीयता" ने मुझे एक पल के लिए उलझन में डाल दिया। आप स्पष्ट रूप से सरणी के मूल्यों को बदल सकते हैं। हालाँकि आप इसका आकार नहीं बदल सकते।
टिम पोहल्मन

125

समस्या यह है कि varargs को Java5 में पेश किया गया और दुर्भाग्य से, Arrays.asList()एक vararg संस्करण के साथ भी अतिभारित हो गया। तो Arrays.asList(spam)Java 5 संकलक द्वारा int सरणियों के vararg पैरामीटर के रूप में समझा जाता है।

इस समस्या को प्रभावी जावा 2 एड में अधिक विवरण में समझाया गया है। अध्याय 7, आइटम 42।


4
मुझे समझ में आया कि क्या हुआ, लेकिन ऐसा क्यों नहीं किया गया क्योंकि इसका दस्तावेजीकरण नहीं किया गया है। मैं पहिया को फिर से लागू किए बिना एक वैकल्पिक समाधान की तलाश कर रहा हूं।
अलेक्जेंड्रू

2
@UsmanIsmail जावा 8 के रूप में, हम इस रूपांतरण के लिए धाराओं का उपयोग कर सकते हैं। नीचे मेरा जवाब देखें
इब्राहिम दुख

109

यह थोड़ा देर से लगता है लेकिन यहाँ मेरे दो सेंट हैं। हम नहीं कर सकते हैं List<int>के रूप में intएक आदिम प्रकार इसलिए हम केवल हो सकता है List<Integer>

जावा 8 (इंट सरणी)

int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList()); 

जावा 8 और नीचे (पूर्णांक सरणी)

Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 =  Arrays.asList(integers); // returns a fixed-size list backed by the specified array.
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only

ArrayList की जरूरत है और सूची की नहीं?

यदि हम Listउदाहरण के लिए एक विशिष्ट कार्यान्वयन चाहते हैं ArrayListतो हम निम्नानुसार उपयोग कर सकते हैं toCollection:

ArrayList<Integer> list24 = Arrays.stream(integers)
                          .collect(Collectors.toCollection(ArrayList::new));

list21संरचनात्मक रूप से संशोधित क्यों नहीं किया जा सकता है?

जब हम Arrays.asListलौटे सूची के आकार का उपयोग करते हैं, तो निश्चित है क्योंकि लौटी सूची नहीं है java.util.ArrayList, लेकिन अंदर एक निजी स्थिर वर्ग परिभाषित किया गया है java.util.Arrays। इसलिए अगर हम लौटी हुई सूची से तत्वों को जोड़ते या हटाते हैं, तो एक UnsupportedOperationExceptionफेंक दिया जाएगा। इसलिए list22जब हम सूची को संशोधित करना चाहते हैं तो हमें साथ जाना चाहिए । अगर हमारे पास जावा 8 है तो हम भी साथ जा सकते हैं list23

स्पष्ट होने के लिए इस list21अर्थ में संशोधित किया जा सकता है कि हम कॉल कर सकते हैं list21.set(index,element)लेकिन यह सूची संरचनात्मक रूप से संशोधित नहीं हो सकती है अर्थात सूची से तत्वों को जोड़ या हटा नहीं सकती है। आप इस प्रश्न को भी देख सकते हैं ।


यदि हम एक अपरिवर्तनीय सूची चाहते हैं तो हम इसे इस प्रकार से लपेट सकते हैं:

List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));

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

हमारे पास जावा 9 और 10 में वास्तव में अपरिवर्तनीय सूची हो सकती है।

सच में अपरिवर्तनीय सूची

जावा 9:

String[] objects = {"Apple", "Ball", "Cat"};
List<String> objectList = List.of(objects);

जावा 10 (सच में अपरिवर्तनीय सूची) दो तरीकों से:

  1. List.copyOf(Arrays.asList(integers))
  2. Arrays.stream(integers).collect(Collectors.toUnmodifiableList());

अधिक के लिए मेरा यह उत्तर भी जांचें ।


@BasilBourque मेरा मतलब था कि सूची की संरचना को जोड़ / हटाकर संशोधित नहीं किया जा सकता है लेकिन तत्वों को बदल सकते हैं।
akhil_mittal

वास्तव में, मैंने कुछ कोड की कोशिश की और पुष्टि की कि कॉलिंग List::add& List::removeविफल एक सूची के साथ वापस आ गई Arrays.asList। इस विधि के लिए JavaDoc खराब लिखा गया है और इस बिंदु पर अस्पष्ट है। मेरे तीसरे पढ़ने पर, मुझे लगता है कि "निश्चित आकार" वाक्यांश का अर्थ यह था कि तत्वों को जोड़ या हटा नहीं सकता।
तुलसी बॉर्क


11

मुझे हाल ही में एक सरणी को एक सूची में बदलना पड़ा। बाद में कार्यक्रम पर डेटा को हटाने का प्रयास करते हुए सूची को फ़िल्टर किया। जब आप Arrays.asList (array) फ़ंक्शन का उपयोग करते हैं, तो आप एक निश्चित आकार संग्रह बनाते हैं: आप न तो जोड़ सकते हैं और न ही हटा सकते हैं। यह प्रविष्टि समस्या को मुझसे बेहतर बताती है: किसी सूची से किसी तत्व को निकालने की कोशिश करते समय मुझे UnsupportedOperationException क्यों मिलती है?

अंत में, मुझे "मैनुअल" रूपांतरण करना पड़ा:

    List<ListItem> items = new ArrayList<ListItem>();
    for (ListItem item: itemsArray) {
        items.add(item);
    }

मुझे लगता है कि मैं एक सूची से सूची में रूपांतरण जोड़ सकते थे।


11
new ArrayList<ListItem>(Arrays.asList(itemsArray))उसी के लिए
Marco13

1
@ ब्रैडीझु: ऊपर दिए गए उत्तर को देखते हुए मेरी समस्या को निश्चित आकार के सरणी के साथ हल नहीं किया गया है, लेकिन आप मूल रूप से आरटीएफएम कह रहे हैं, जो हमेशा खराब होता है। कृपया जवाब के साथ क्या गलत है या टिप्पणी करने की जहमत न उठाएं इस पर विस्तार से बताएं।
स्टीव गेलमैन

2
निरीक्षण उपकरण यहां एक चेतावनी दिखा सकते हैं, और आपने इसका कारण बताया है। तत्वों को मैन्युअल रूप से कॉपी करने की आवश्यकता नहीं है, Collections.addAll(items, itemsArray)इसके बजाय उपयोग करें ।
Darek Kay

बस इस अपवाद को मारो। मुझे डर है कि मार्को 13 का उत्तर सही उत्तर होना चाहिए। मुझे सभी "asList" अपवाद को ठीक करने के लिए पूरे वर्ष के कोड पर जाने की आवश्यकता हो सकती है।

7

Arrays का उपयोग करना

किसी ऐरे को कन्वर्ट करने का यह सबसे सरल तरीका है List। हालांकि, यदि आप एक नया तत्व जोड़ने या सूची से मौजूदा तत्व को हटाने की कोशिश करते हैं, तो एक UnsupportedOperationExceptionफेंक दिया जाएगा।

Integer[] existingArray = {1, 2, 3};
List<Integer> list1 = Arrays.asList(existingArray);
List<Integer> list2 = Arrays.asList(1, 2, 3);

// WARNING:
list2.add(1);     // Unsupported operation!
list2.remove(1);  // Unsupported operation!

ArrayList या अन्य सूची कार्यान्वयन का उपयोग करना

आप forसरणी के सभी तत्वों को एक Listकार्यान्वयन में जोड़ने के लिए लूप का उपयोग कर सकते हैं , जैसे ArrayList:

List<Integer> list = new ArrayList<>();
for (int i : new int[]{1, 2, 3}) {
  list.add(i);
}

जावा 8 में स्ट्रीम एपीआई का उपयोग करना

आप सरणी को एक स्ट्रीम में बदल सकते हैं, फिर विभिन्न कलेक्टरों का उपयोग करके स्ट्रीम को इकट्ठा कर सकते हैं: जावा 8 में डिफ़ॉल्ट कलेक्टर ArrayListस्क्रीन के पीछे उपयोग करते हैं, लेकिन आप अपने पसंदीदा कार्यान्वयन को भी लागू कर सकते हैं।

List<Integer> list1, list2, list3;
list1 = Stream.of(1, 2, 3).collect(Collectors.toList());
list2 = Stream.of(1, 2, 3).collect(Collectors.toCollection(ArrayList::new));
list3 = Stream.of(1, 2, 3).collect(Collectors.toCollection(LinkedList::new));

यह सभी देखें:


6

यदि आप अपाचे कॉमन्स-लैंग का उपयोग करते हैं तो एक और वर्कअराउंड:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(ArrayUtils.toObject(spam));

जहाँ ArrayUtils.toObject धर्मान्तरित int[]हैInteger[]


5

आपको ऐरे में डालना होगा

Arrays.asList((Object[]) array)

3
जावा: असंगत प्रकार: int [] को java.lang.Object में परिवर्तित नहीं किया जा सकता है []
dVaffection

@ वफ़ात फिर int [] के लिए डाली। महत्वपूर्ण हिस्सा एक सरणी में डालना है।
नेब्राबिल


5

जावा 9 में आपके पास नई सुविधा फैक्टरी विधि के माध्यम से अपरिवर्तनीय सूचियों का उपयोग करने का और भी अधिक सुंदर समाधान है List.of:

List<String> immutableList = List.of("one","two","three");

(बेशर्मी से यहाँ से कॉपी किया गया )


FYI करें, इसके पीछे के कुछ तकनीकी विवरण जानने के लिए, JEP 269 देखें : संग्रह के लिए सुविधा कारखाने के तरीके और प्रमुख लेखक स्टुअर्ट मार्क्स द्वारा एक वार्ता
बेसिल बोर्के

5

यदि आप जावा 8 (या बाद में) को लक्षित कर रहे हैं, तो आप यह कोशिश कर सकते हैं:

int[] numbers = new int[] {1, 2, 3, 4};
List<Integer> integers = Arrays.stream(numbers)
                        .boxed().collect(Collectors.<Integer>toList());

ध्यान दें:

करने के लिए वेतन ध्यान Collectors.<Integer>toList(), इस सामान्य प्रक्रिया में त्रुटि "प्रकार बेमेल: से परिवर्तित नहीं कर सकते से बचने के लिए मदद करता है List<Object>करने के लिए List<Integer>"।


4
  1. अमरूद का उपयोग:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = Lists.newArrayList(sourceArray);
  2. अपाचे कॉमन्स कलेक्शंस का उपयोग करना:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = new ArrayList<>(6);
    CollectionUtils.addAll(list, array);

3

यदि यह मदद करता है: मुझे एक ही समस्या है और बस एक सामान्य कार्य लिखा है जो एक सरणी लेता है और एक ही प्रकार के ArrayList को उसी सामग्री के साथ लौटाता है:

public static <T> ArrayList<T> ArrayToArrayList(T[] array) {
    ArrayList<T> list = new ArrayList<T>();
    for(T elmt : array) list.add(elmt);
    return list;
}

अगर यह मदद नहीं करता है तो क्या होगा? फिर आपने क्या किया ?? ... jk :)
Sᴀᴍ Onᴇᴌᴀ

2

दिया गया एरियर:

    int[] givenArray = {2,2,3,3,4,5};

पूर्णांक सरणी को पूर्णांक सूची में परिवर्तित करना

एक तरीका: बॉक्सिंग () -> इंटस्ट्रीम देता है

    List<Integer> givenIntArray1 = Arrays.stream(givenArray)
                                  .boxed()
                                  .collect(Collectors.toList());

दूसरा तरीका: स्ट्रीम के प्रत्येक तत्व को इंटेगर में मैप करें और फिर इकट्ठा करें

नोट: mapToObj का उपयोग करके आप स्ट्रिंग (i) (i) के लिए केसिंग द्वारा प्रत्येक इंट एलिमेंट को स्ट्रिंग स्ट्रीम, चार स्ट्रीम आदि में शामिल कर सकते हैं।

    List<Integer> givenIntArray2 = Arrays.stream(givenArray)
                                         .mapToObj(i->i)
                                         .collect(Collectors.toList());

एक सरणी प्रकार को दूसरे प्रकार के उदाहरण में परिवर्तित करना:

List<Character> givenIntArray2 = Arrays.stream(givenArray)
                                             .mapToObj(i->(char)i)
                                             .collect(Collectors.toList());

1

तो यह निर्भर करता है कि आप किस जावा संस्करण की कोशिश कर रहे हैं-

जावा 7

 Arrays.asList(1, 2, 3);

या

       final String arr[] = new String[] { "G", "E", "E", "K" };
       final List<String> initialList = new ArrayList<String>() {{
           add("C");
           add("O");
           add("D");
           add("I");
           add("N");
       }};

       // Elements of the array are appended at the end
       Collections.addAll(initialList, arr);

या

Integer[] arr = new Integer[] { 1, 2, 3 };
Arrays.asList(arr);

जावा 8 में

int[] num = new int[] {1, 2, 3};
List<Integer> list = Arrays.stream(num)
                        .boxed().collect(Collectors.<Integer>toList())

संदर्भ - http://www.codingeek.com/java/how-to-convert-array-to-list-in-java/


1

क्या आप इस उत्तर में सुधार कर सकते हैं क्योंकि यह वही है जो मैं उपयोग करता हूं लेकिन 100% स्पष्ट नहीं है। यह ठीक काम करता है लेकिन intelliJ ने नया वेदरोग्राफ़ी जोड़ा [को ०]। 0 क्यों?

    public WeatherStation[] removeElementAtIndex(WeatherStation[] array, int index)
    {
        List<WeatherStation> list = new ArrayList<WeatherStation>(Arrays.asList(array));
        list.remove(index);
        return list.toArray(new WeatherStation[0]);
    }


हमें आपके प्रश्न में सुधार क्यों करना चाहिए ? या तो आप जवाब जानते हैं, या आप नहीं करते हैं। आपको निश्चित रूप से एक उत्तर देना चाहिए जो वास्तव में दूसरों की मदद करता है, न कि किसी को इससे अधिक भ्रमित करने वाले की मदद करता है।
हिमब्रोबेरे

-2

सरणी को सूची में बदलने के लिए कोड की दो पंक्ति का उपयोग करें यदि आप पूर्णांक मूल्य में इसका उपयोग करते हैं तो आपको आदिम डेटा प्रकार के लिए ऑटोबॉक्सिंग प्रकार का उपयोग करना होगा

  Integer [] arr={1,2};
  Arrays.asList(arr);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.