[java] जावा में सूची में सरणी को कनवर्ट करना


Answers

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

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

Question

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

मैंने 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);



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

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

जहां ArrayUtils.toObject int[] को Integer[] परिवर्तित करता है Integer[]




एक लाइन:

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



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

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

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

मुझे लगता है कि मैं List.addAll (आइटम) ऑपरेशन का उपयोग कर किसी सरणी से एक सूची में रूपांतरण जोड़ सकता था।




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 या अन्य सूची कार्यान्वयन का उपयोग करना

आप सरणी के सभी तत्वों को List कार्यान्वयन में जोड़ने के for लूप का उपयोग कर सकते हैं, उदाहरण के लिए 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));

यह भी देखें:




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

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

( here से लापरवाही से कॉपी)




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

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



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

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



Related