एक पंक्ति में एक ArrayList का प्रारंभ


2754

मैं परीक्षण उद्देश्यों के लिए विकल्पों की एक सूची बनाना चाहता था। सबसे पहले, मैंने ऐसा किया:

ArrayList<String> places = new ArrayList<String>();
places.add("Buenos Aires");
places.add("Córdoba");
places.add("La Plata");

फिर, मैंने निम्नानुसार कोड को वापस ले लिया:

ArrayList<String> places = new ArrayList<String>(
    Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

क्या ऐसा करने के लिए इससे अच्छा तरीका है?


34
यदि यह इकाई परीक्षण के लिए है, तो एक झूले के लिए कमर कस लें। जावा कोड का परीक्षण करते समय आप इसमें अपना परीक्षण कोड लिख सकते हैं, और उपयोग कर सकते हैंArrasyList<String> places = ["Buenos Aires", "Córdoba", "La Plata"]
ripper234

3
जावा एसई 7 में, आप एक प्रकार के पैरामीटर के खाली सेट (<>): मानचित्र <स्ट्रिंग, सूची <स्ट्रिंग >> myMap = नया HashMap <> () के साथ रचनाकार के पैरामीटर प्रकार को प्रतिस्थापित कर सकते हैं;
गुलाब


2
डबल ब्रेज़िंग इनिशियलाइज़ेशन का उपयोग करें :)
मोहम्मदरेज़ा खातमी

8
Stream.of ("val1", "val2")। एकत्रित करना (कलेक्टर .toList ()); // ArrayList, Java8 समाधान बनाता है।
टोरिना

जवाबों:


2022

वास्तव में, संभवतः "आरंभ करने का सबसे अच्छा तरीका" वह तरीका ArrayListहै जिसे आपने लिखा है, क्योंकि इसे Listकिसी भी तरह से एक नया बनाने की आवश्यकता नहीं है :

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");

पकड़ यह है कि उस listउदाहरण को संदर्भित करने के लिए बहुत कुछ टाइपिंग आवश्यक है ।

ऐसे विकल्प हैं, जैसे एक उदाहरण इनिलाइज़र के साथ एक अनाम आंतरिक वर्ग बनाना (जिसे "डबल ब्रेस इनिशियलाइज़ेशन" के रूप में भी जाना जाता है):

ArrayList<String> list = new ArrayList<String>() {{
    add("A");
    add("B");
    add("C");
}};

हालाँकि, मैं उस पद्धति का बहुत शौकीन नहीं हूँ क्योंकि आप जो समाप्त करते हैं वह एक उपवर्ग है ArrayListजिसका एक उदाहरण इनिशियलाइज़र है, और वह वर्ग केवल एक वस्तु बनाने के लिए बनाया गया है - जो कि मुझे थोड़ा सा ओवरकिल लगता है।

क्या अच्छा होता अगर प्रोजेक्ट कॉइन के लिए कलेक्शन लिटरल्स का प्रस्ताव स्वीकार कर लिया जाता (इसे जावा 7 में पेश किया जाना था, लेकिन इसके जावा 8 का हिस्सा होने की संभावना नहीं है।):

List<String> list = ["A", "B", "C"];

दुर्भाग्य से यह यहाँ आपकी मदद नहीं करेगा, क्योंकि यह एक के Listबजाय एक अपरिवर्तनीय को इनिशियलाइज़ करेगा ArrayList, और इसके अलावा, यह अभी तक उपलब्ध नहीं है, अगर यह कभी भी होगा।


172
डबल-ब्रेस आरंभीकरण, पेशेवरों और विपक्षों के बारे में अधिक जानकारी के लिए stackoverflow.com/questions/924285 देखें ।
एडी

6
@ एडी: लिंक के लिए अच्छी कॉल - डबल ब्रेस इनिशियलाइज़ेशन पर एक वाक्य पूरी तरह से वर्णन करने के लिए पर्याप्त नहीं है।
कोबर्ड

2
केवल तभी काम करता है जब आप ऑटो बॉक्सिंग सूची <डबल> सूची = [1.0, 2.0, 3.0] पर भरोसा नहीं कर रहे हैं; विफल रहता है।
रिचर्ड बी

1
आपको डबल-लिस्ट इनिशियलाइज़ेशन पर एक अर्धविराम याद आ रहा है
डॉन लैरिंक्स

6
चूँकि यह उत्तर सबसे उत्कीर्ण और उल्लिखित प्रोजेक्ट कॉइन है, इसलिए मुझे लगता है कि आपको उस 9 जावा को कॉल करना चाहिए जिसे List.of (...) सिंटैक्स: docs.oracle.com/javase/9/docs/api/java/util के
आसफ

2154

यह सरल होगा यदि आप इसे सिर्फ एक के रूप में घोषित करते हैं List- क्या यह एक एरेलेस्ट बनना है?

List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");

या यदि आपके पास केवल एक तत्व है:

List<String> places = Collections.singletonList("Buenos Aires");

इसका मतलब यह होगा कि placesहै अपरिवर्तनीय (यह एक कारण होगा बदलने का प्रयास कर UnsupportedOperationExceptionअपवाद उत्पन्न करने के लिए)।

एक ऐसी परिवर्तनशील सूची बनाने के लिए जो ArrayListआप एक ठोस ArrayListसूची से बना सकते हैं :

ArrayList<String> places = new ArrayList<>(Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

18
@ चेतावनी: क्या आप अपने वर्ग को ArrayList के बजाय एक सूची का उपयोग करने के लिए नहीं बदल सकते हैं?
लॉरेंस डोल

74
मेरे उत्तर के अनुसार, यदि आप विशिष्ट विधियों का उपयोग नहीं कर रहे हैं, तो ArrayListघोषणा को बदलना बेहतर होगा List। इंटरफेस निर्दिष्ट करें, कार्यान्वयन नहीं।
क्रिस्टोफर हम्मरस्ट्रॉम

9
@Christoffer Hammarström: यदि वह सूची में घोषणा को बदलता है और सूची <स्ट्रिंग> स्थानों = Arrays.asList (...) का उपयोग करता है; वह उपयोग करने के लिए सक्षम नहीं होगा places.add ( "blabla")
maks

57
बस स्पष्ट होने के लिए, asList(...)एक निश्चित आकार लौटाता है जो Listउत्परिवर्तित संचालन जैसे removeऔरclear , Listअनुबंध का समर्थन करने का दावा करता है। यहां तक ​​कि अगर आपने घोषणा को छोड़ दिया है List, तो आपको List l = new ArrayList(asList(...))एक ऑब्जेक्ट प्राप्त करने के लिए उपयोग करने की आवश्यकता है, जो ऑपरेशननोटस्पोर्टेड अपवादों को नहीं फेंकता है। Liskov प्रतिस्थापन सिद्धांत किसी को भी?
स्पलैश

4
@ स्लैश: removeऔर clearवैकल्पिक संचालन में हैं List, इसलिए asList(...)अनुबंध का पालन करता है। ओपी कहते हैं कि उन्हें बाद में और तत्वों को जोड़ने की जरूरत है, उदाहरण सिर्फ एक का हैList तीन तत्वों के साथ आरंभ करने की आवश्यकता है।
क्रिस्टोफर हैमरस्ट्रॉम

870

सरल उत्तर

में जावा 9 या बाद में, के बाद List.of()जोड़ा गया है:

List<String> strings = List.of("foo", "bar", "baz");

साथ जावा 10 या बाद में, इस के साथ छोटा किया जा सकता varकीवर्ड।

var strings = List.of("foo", "bar", "baz");

यह आपको अपरिवर्तनीय देगा List , इसलिए इसे बदला नहीं जा सकता।
जो आप चाहते हैं कि ज्यादातर मामलों में आप इसे तैयार कर रहे हैं।


जावा 8 या पूर्व:

List<String> strings = Arrays.asList("foo", "bar", "baz");

यह आपको एक Listसरणी द्वारा समर्थित देगा , इसलिए यह लंबाई नहीं बदल सकता है।
लेकिन आप कॉल कर सकते हैं List.set, इसलिए यह अभी भी परिवर्तनशील है


आप Arrays.asListस्थैतिक आयात के साथ भी कम कर सकते हैं :

List<String> strings = asList("foo", "bar", "baz");

स्थिर आयात:

import static java.util.Arrays.asList;  

जो कोई भी आधुनिक आईडीई सुझाव देगा और स्वचालित रूप से आपके लिए करेगा।
IntelliJ IDEA में उदाहरण के लिए आप दबाएँ Alt+Enterऔर चुनें Static import method...


हालाँकि, मैं छोटा करने की सलाह नहीं देता List.of विधि को करता of, क्योंकि यह भ्रामक हो जाता है।
List.ofपहले से ही काफी छोटा है और अच्छी तरह से पढ़ता है।


का उपयोग करते हुए Streamरों

यह एक होना क्यों है List?
जावा 8 या बाद में आप एक का उपयोग कर सकते हैं Streamजो अधिक लचीला है:

Stream<String> strings = Stream.of("foo", "bar", "baz");

आप सहमति बना सकते हैं Stream :

Stream<String> strings = Stream.concat(Stream.of("foo", "bar"),
                                       Stream.of("baz", "qux"));

या आप ए से जा सकते हैं Stream एक करने के लिए List:

import static java.util.stream.Collectors.toList;

List<String> strings = Stream.of("foo", "bar", "baz").collect(toList());

लेकिन अधिमानतः, बस का उपयोग करें Stream इसे इकट्ठा बिना एक काList


अगर तुम सच में विशेष रूप से एक की जरूरत हैjava.util.ArrayList

(आप शायद नहीं।)
बोली के लिए JEP 269 (जोर मेरा) :

एक छोटा सा सेट हैमूल्यों के पूर्वनिर्धारित सेट के साथ एक उत्परिवर्तित संग्रह उदाहरण को शुरू करने के लिए उपयोग के मामलों है। आमतौर पर उन पूर्वनिर्धारित मूल्यों को एक अपरिवर्तनीय संग्रह में रखना बेहतर होता है, और फिर एक प्रतिलिपि निर्माता के माध्यम से उत्परिवर्तित संग्रह को आरंभ करना।


आप चाहते हैं दोनों prepopulate एक ArrayList और बाद में, उपयोग यह करने के लिए जोड़ (क्यों?)

ArrayList<String> strings = new ArrayList<>(List.of("foo", "bar"));
strings.add("baz");

या जावा 8 या पूर्व में:

ArrayList<String> strings = new ArrayList<>(asList("foo", "bar"));
strings.add("baz");

या उपयोग कर रहा है Stream :

import static java.util.stream.Collectors.toCollection;

ArrayList<String> strings = Stream.of("foo", "bar")
                             .collect(toCollection(ArrayList::new));
strings.add("baz");

लेकिन फिर, यह सिर्फ का उपयोग करने के लिए बेहतर है Stream सीधे करने के बजाय इसे इकट्ठा करने के लिए बेहतर है List


कार्यक्रम इंटरफेस के लिए, कार्यान्वयन के लिए नहीं

आपने कहा कि आपने सूची को ArrayListअपने कोड में घोषित कर दिया है , लेकिन आपको केवल यही करना चाहिए कि यदि आप ArrayListउस सदस्य का उपयोग कर रहे हैं जो अंदर नहीं हैList

जो आप कर रहे हैं सबसे अधिक संभावना है।

आमतौर पर आपको केवल सबसे सामान्य इंटरफ़ेस द्वारा चर घोषित करना चाहिए जिसे आप उपयोग करने जा रहे हैं (उदाहरण Iterableके लिए Collection, या List), और उन्हें विशिष्ट कार्यान्वयन के साथ आरंभ करें (जैसे ArrayList,LinkedList याArrays.asList() )।

अन्यथा आप अपने कोड को उस विशिष्ट प्रकार तक सीमित कर रहे हैं, और जब आप चाहते हैं तब इसे बदलना कठिन होगा।

उदाहरण के लिए, यदि आप एक ArrayListको पास कर रहे हैं void method(...):

// Iterable if you just need iteration, for (String s : strings):
void method(Iterable<String> strings) { 
    for (String s : strings) { ... } 
}

// Collection if you also need .size(), .isEmpty(), or .stream():
void method(Collection<String> strings) {
    if (!strings.isEmpty()) { strings.stream()... }
}

// List if you also need .get(index):
void method(List<String> strings) {
    strings.get(...)
}

// Don't declare a specific list implementation
// unless you're sure you need it:
void method(ArrayList<String> strings) {
    ??? // You don't want to limit yourself to just ArrayList
}

एक और उदाहरण हमेशा चर की घोषणा करना होगा InputStreamभले ही यह आमतौर पर एक FileInputStreamया एक है BufferedInputStream, क्योंकि एक दिन जल्द ही आप या कोई और किसी अन्य प्रकार का उपयोग करना चाहेगा InputStream


3
@ जॉलीग्रॉगर: Arrays.asListएक स्थिर विधि है। Docs.oracle.com/javase/1.5.0/docs/guide/language/…
क्रिस्टोफ़र

2
@ ChristofferHammarström उस मामले में, मेरा नौसिखिया मन मुझे बताता है कि स्थैतिक आयात वैश्विक चर और इस तरह के उपयोग से संबंधित खतरों से मजबूत समानता रखता है। क्या यह धारणा सही है और क्या यह भी इसी तरह के उत्तर के लिए अधिक वोट पाने का कारण है?
जॉलीगर

2
उपरोक्त उत्तर मुझे लगता है कि आप जिस बारे में बात कर रहे हैं, वह एक साल पहले किया गया था। और नहीं, वैश्विक चरों के साथ समस्या यह है कि वे परस्पर हैं। उनका स्थैतिक आयात से कोई लेना-देना नहीं है।
क्रिस्टोफर हम्मरस्ट्रॉम 14

2
यदि आप स्थैतिक आयात नहीं चाहते हैं, तो आप स्थैतिक asList पद्धति के लिए पूर्ण पथ को भी परिभाषित कर सकते हैं, इसलिए: सूची <string> strings = java.util.Arrays.asList ("", "");
गर्ट वेनिंग

2
या आप आयात java.util.Arrays का उपयोग कर सकते हैं; और Arrays.asList ("", ""); आपको एक स्थिर आयात का उपयोग करने की आवश्यकता नहीं है। आपको पूर्ण पथ का उपयोग करने की आवश्यकता नहीं है। स्थैतिक तरीके आयात के बारे में परवाह नहीं करते हैं। यदि आप उन्हें खोजने के लिए एक उदाहरण का उपयोग करते हैं तो वे बस नाराज हो जाते हैं।
कैंडिड_ऑरेंज सेप

111

यदि आपको आकार 1 की एक सरल सूची चाहिए:

List<String> strings = new ArrayList<String>(Collections.singletonList("A"));

यदि आपको कई वस्तुओं की सूची चाहिए:

List<String> strings = new ArrayList<String>();
Collections.addAll(strings,"A","B","C","D");

57

अमरूद के साथ आप लिख सकते हैं:

ArrayList<String> places = Lists.newArrayList("Buenos Aires", "Córdoba", "La Plata");

अमरूद में अन्य उपयोगी स्थैतिक निर्माता भी हैं। आप उनके बारे में यहां पढ़ सकते हैं ।


1
मुझे पूरा यकीन है कि आप इसे java.util.Arraysऐसे ही कर सकते हैं , जैसेList<String> names = Arrays.asList("Beckah", "Sam", "Michael");
19

2
@beckah मेथड Arrays.asLists टाइप लिस्ट का ऑब्जेक्ट बनाता है, जबकि सवाल ArrayList बनाने के बारे में है
Paweł Adamski


34

संग्रह शाब्दिकों ने इसे जावा 8 में नहीं बनाया, लेकिन एक लंबी लाइन में किसी सूची को आरंभ करने के लिए स्ट्रीम एपीआई का उपयोग करना संभव है:

List<String> places = Stream.of("Buenos Aires", "Córdoba", "La Plata").collect(Collectors.toList());

यदि आपको यह सुनिश्चित करने की आवश्यकता है कि आपका Listएक ArrayList:

ArrayList<String> places = Stream.of("Buenos Aires", "Córdoba", "La Plata").collect(Collectors.toCollection(ArrayList::new));

34

साथ में और ऊपर, जेईपी 269 में सुझाव दिया गया है : संग्रह के लिए सुविधा कारखाने के तरीके , यह अब संग्रह शाब्दिक का उपयोग करके प्राप्त किया जा सकता है -

List<String> list = List.of("A", "B", "C");

Set<String> set = Set.of("A", "B", "C");

इसी तरह का दृष्टिकोण भी लागू होगा Map-

Map<String, String> map = Map.of("k1", "v1", "k2", "v2", "k3", "v3")

जो कि कलेक्शन के प्रस्ताव के समान है, जैसा कि @coobird द्वारा कहा गया है। जेईपी में आगे भी स्पष्ट किया गया है -


वैकल्पिक

भाषा परिवर्तन कई बार माना गया है, और खारिज कर दिया गया है:

परियोजना सिक्का प्रस्ताव, 29 मार्च 2009

परियोजना सिक्का प्रस्ताव, 30 मार्च 2009

JEP 186 चर्चा लंबोदर-देव, जनवरी-मार्च 2014 पर

इस संदेश में संक्षेप में एक पुस्तकालय-आधारित प्रस्ताव को प्राथमिकता देते हुए भाषा प्रस्तावों को अलग रखा गया था

संबंधित: जावा 9 में संग्रह के लिए अतिभारित सुविधा कारखाना विधियों का क्या मतलब है


31
import com.google.common.collect.ImmutableList;

....

List<String> places = ImmutableList.of("Buenos Aires", "Córdoba", "La Plata");

4
मैं ऐसा करने के लिए एक नई निर्भरता जोड़ना नहीं चाहता।
मकार

6
यह वैसा ही है Collections.unmodifiableList(Arrays.asList("Buenos Aires", "Córdoba", "La Plata")), जैसा unmodifiableList(asList("Buenos Aires", "Córdoba", "La Plata"))स्थैतिक आयात के साथ बनता है । इसके लिए आपको Google संग्रह की आवश्यकता नहीं है।
क्रिस्टोफर हम्मरस्ट्रॉम

9
नहीं, ऐसा नहीं है। के रूप में ImmutableList परिणाम प्रकार में अपनी अपरिवर्तनीयता का दस्तावेजीकरण कर रहा है जब unmodifiableList इसे एक सामान्य सूची के रूप में मास्क करता है।
डेविड पियरे

2
अपरिवर्तनीय के बजाय, Google संग्रह भी परिवर्तनशील सरणी सूची प्रदान करते हैं: सूची <string> = Lists.newArrayList ("ब्यूनस आयर्स", "कोर्डोबा", "ला प्लाटा");
एल। होलांडा

3
आप इसे ImmutableListअन्य तरीकों से पास करने जा रहे हैं जो एक लेते हैं List, और फिर आप उस दस्तावेज को वैसे भी खो चुके हैं।
क्रिस्टोफर हम्मरस्ट्रोम जूल

23

आप एक कारखाना विधि बना सकते हैं:

public static ArrayList<String> createArrayList(String ... elements) {
  ArrayList<String> list = new ArrayList<String>();
  for (String element : elements) {
    list.add(element);
  }
  return list;
}

....

ArrayList<String> places = createArrayList(
  "São Paulo", "Rio de Janeiro", "Brasília");

लेकिन यह आपके पहले रिफैक्टरिंग से बहुत बेहतर नहीं है।

अधिक लचीलेपन के लिए, यह सामान्य हो सकता है:

public static <T> ArrayList<T> createArrayList(T ... elements) {
  ArrayList<T> list = new ArrayList<T>();
  for (T element : elements) {
    list.add(element);
  }
  return list;
}

1
मूल पोस्ट को देखें, यह एक पंक्ति में सरणी आरंभीकरण के लिए कह रही है , 7 अतिरिक्त लाइनें नहीं।
एल। होलांडा

7
@ लॉहोलैंड: हर छोटी चीज़ के लिए फैक्ट्री के तरीके बनाना बहुत ज्यादा है, मैं मानता हूँ। लेकिन स्थिति पर निर्भर करता है, और उस पद्धति का उपयोग करने जा रहे समय की संख्या पर, इसे बनाने के लिए समझ में आ सकता है। अतिरिक्त अमूर्त परतों का निर्माण जटिलता को हटाने के लिए होता है, डिजाइनर के इरादे को पकड़ने वाले अधिक सार्थक तरीके बनाकर ।
जोर्डो

16

जावा 9 में हम ArrayListएक लाइन में आसानी से इनिशियलाइज़ कर सकते हैं :

List<String> places = List.of("Buenos Aires", "Córdoba", "La Plata");

या

List<String> places = new ArrayList<>(List.of("Buenos Aires", "Córdoba", "La Plata"));

जावा 9 के इस नए दृष्टिकोण में पिछले वाले की तुलना में कई फायदे हैं:

  1. अंतरिक्ष क्षमता
  2. अचल स्थिति
  3. सुरक्षित धागा

अधिक जानकारी के लिए इस पोस्ट को देखें -> List.of और Arrays.asList में क्या अंतर है?


8

ऐसा करने के सबसे कॉम्पैक्ट तरीके के बारे में है:

Double array[] = { 1.0, 2.0, 3.0};
List<Double> list = Arrays.asList(array);

8

बस नीचे दिए गए कोड का उपयोग करें।

List<String> list = new ArrayList<String>() {{
            add("A");
            add("B");
            add("C");
}};

2
@bsd आप किसी भी विधि को दर्ज करने से पहले सूची को घोषित करने के लिए इस पद्धति का उपयोग कर सकते हैं। इसलिए जब वर्ग चर को परिभाषित करते हैं, तो सामग्री को सूची में जोड़ा जा सकता है, ऐसा करने के लिए एक विधि को आमंत्रित किए बिना।
मेल्विल

2
जहाँ तक संभव हो डबल ब्रेसेस इनिशियलाइज़ेशन से बचना चाहिए। देखें: stackoverflow.com/a/924326/760393
राउल

8

ग्रहण संग्रह के साथ आप निम्नलिखित लिख सकते हैं:

List<String> list = Lists.mutable.with("Buenos Aires", "Córdoba", "La Plata");

आप प्रकारों के बारे में अधिक विशिष्ट भी हो सकते हैं और चाहे वे म्यूटेबल या अपरिवर्तनीय हों।

MutableList<String> mList = Lists.mutable.with("Buenos Aires", "Córdoba", "La Plata");
ImmutableList<String> iList = Lists.immutable.with("Buenos Aires", "Córdoba", "La Plata");

आप सेट्स और बैग्स के साथ भी ऐसा कर सकते हैं:

Set<String> set = Sets.mutable.with("Buenos Aires", "Córdoba", "La Plata");
MutableSet<String> mSet = Sets.mutable.with("Buenos Aires", "Córdoba", "La Plata");
ImmutableSet<String> iSet = Sets.immutable.with("Buenos Aires", "Córdoba", "La Plata");

Bag<String> bag = Bags.mutable.with("Buenos Aires", "Córdoba", "La Plata");
MutableBag<String> mBag = Bags.mutable.with("Buenos Aires", "Córdoba", "La Plata");
ImmutableBag<String> iBag = Bags.immutable.with("Buenos Aires", "Córdoba", "La Plata");

नोट: मैं एक्लिप्स कलेक्शंस के लिए कमिट हूं।



7

(एक टिप्पणी होनी चाहिए, लेकिन बहुत लंबी है, इसलिए नया उत्तर)। जैसा कि दूसरों ने उल्लेख किया है, Arrays.asListविधि निश्चित आकार है, लेकिन इसके साथ एकमात्र मुद्दा नहीं है। यह भी विरासत को बहुत अच्छी तरह से संभाल नहीं करता है। उदाहरण के लिए, मान लें कि आपके पास निम्नलिखित हैं:

class A{}
class B extends A{}

public List<A> getAList(){
    return Arrays.asList(new B());
}

संकलक त्रुटि में उपरोक्त परिणाम, क्योंकि List<B>(जो कि Arrays.asList द्वारा लौटाया गया है) एक उपवर्ग नहीं है List<A>, भले ही आप किसी List<A>वस्तु में टाइप बी की वस्तुओं को जोड़ सकते हैं । इसके आसपास जाने के लिए, आपको कुछ करने की आवश्यकता है:

new ArrayList<A>(Arrays.<A>asList(b1, b2, b3))

यह शायद ऐसा करने के बारे में जाने का सबसे अच्छा तरीका है, esp। यदि आपको एक अनबाउंड सूची की आवश्यकता है या वंशानुक्रम का उपयोग करने की आवश्यकता है।


6

आप नीचे दिए गए कथनों का उपयोग कर सकते हैं:

सांकेतिक टुकड़ा:

String [] arr = {"Sharlock", "Homes", "Watson"};

List<String> names = Arrays.asList(arr);

आप कॉम्पैक्ट सॉल्यूशन के लिए पहले एक्सप्रेशन को इनलाइन कर सकते हैं:letters = Arrays.asList(new String[]{"A", "B", "C"});
पावेल रेपिन

5

जैसा टॉम ने कहा :

List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");

लेकिन जब से आपने एक ArrayList चाहने की शिकायत की, तो आपको सबसे पहले यह जानना चाहिए कि ArrayList List का उपवर्ग है और आप बस इस लाइन को जोड़ सकते हैं:

ArrayList<String> myPlaces = new ArrayList(places);

हालाँकि, इससे आपको 'प्रदर्शन' की शिकायत हो सकती है।

उस मामले में मुझे इससे कोई मतलब नहीं है, क्यों, आपकी सूची पूर्वनिर्धारित होने के बाद से इसे एक सरणी के रूप में परिभाषित नहीं किया गया था (क्योंकि आकार को प्रारंभिककरण के समय जाना जाता है)। और अगर यह आपके लिए एक विकल्प है:

String[] places = {"Buenos Aires", "Córdoba", "La Plata"};

यदि आप मामूली प्रदर्शन मतभेदों की परवाह नहीं करते हैं, तो आप किसी सरणी को ArrayList में बहुत सरलता से कॉपी कर सकते हैं:

ArrayList<String> myPlaces = new ArrayList(Arrays.asList(places));

ठीक है, लेकिन भविष्य में आपको केवल स्थान के नाम से कुछ अधिक की आवश्यकता है, आपको एक देश कोड भी चाहिए। यह मानते हुए कि अभी भी एक पूर्वनिर्धारित सूची है जो रन-टाइम के दौरान कभी नहीं बदलेगी, तो यह एक enumसेट का उपयोग करने के लिए उपयुक्त है , जिसे भविष्य में सूची को बदलने की आवश्यकता होती है, तो पुन: संकलन की आवश्यकता होगी।

enum Places {BUENOS_AIRES, CORDOBA, LA_PLATA}

बन जाएगा:

enum Places {
    BUENOS_AIRES("Buenos Aires",123),
    CORDOBA("Córdoba",456),
    LA_PLATA("La Plata",789);

    String name;
    int code;
    Places(String name, int code) {
      this.name=name;
      this.code=code;
    }
}

Enum की एक स्थिर valuesविधि है जो एक सरणी देता है जिसमें एनम के सभी मानों को क्रम में रखा जाता है, जैसे कि वे घोषित किए जाते हैं:

for (Places p:Places.values()) {
    System.out.printf("The place %s has code %d%n",
                  p.name, p.code);
}

उस स्थिति में मुझे लगता है कि आपको अपने ArrayList की आवश्यकता नहीं होगी।

पीएस रंड्या ने स्थैतिक उपयोगिता पद्धति कलेक्शंस.एडडॉल का उपयोग करते हुए एक और अच्छा तरीका प्रदर्शित किया


5

जावा 9 में एक अपरिवर्तनीय सूची बनाने के लिए निम्नलिखित विधि है :

List<String> places = List.of("Buenos Aires", "Córdoba", "La Plata");

यदि आवश्यक हो तो आसानी से एक परिवर्तनशील सूची बनाने के लिए अनुकूलित किया गया है:

List<String> places = new ArrayList<>(List.of("Buenos Aires", "Córdoba", "La Plata"));

इसी तरह के तरीकों Setऔर के लिए उपलब्ध हैं Map


1
यह अच्छा है कि आपने स्पष्ट रूप से "अपरिवर्तनीय सूची" कहा था और फिर उत्परिवर्तित सूची का एक और उदाहरण दिखाया क्योंकि यह स्पष्ट करता है कि कब किसका उपयोग करना है।
चेरी





2

जावा में, आप ऐसा नहीं कर सकते

ArrayList<String> places = new ArrayList<String>( Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

जैसा कि बताया गया था, आपको डबल ब्रेस इनिशियलाइज़ेशन करने की आवश्यकता होगी:

List<String> places = new ArrayList<String>() {{ add("x"); add("y"); }};

लेकिन यह आपको एक एनोटेशन जोड़ने में मजबूर कर सकता है @SuppressWarnings("serial") या एक सीरियल UUID उत्पन्न कर सकता है जो कष्टप्रद है। इसके अलावा अधिकांश कोड स्वरूपक कई बयानों / पंक्तियों में प्रकट नहीं होंगे।

वैकल्पिक रूप से आप कर सकते हैं

List<String> places = Arrays.asList(new String[] {"x", "y" });

लेकिन तब आप एक करना चाहते हो सकता है @SuppressWarnings("unchecked")

इसके अलावा javadoc के अनुसार आपको ऐसा करने में सक्षम होना चाहिए:

List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");

लेकिन मैं इसे JDK 1.6 के साथ संकलित करने में सक्षम नहीं हूं।


5
गलत! आप कर सकते हैं पहली पंक्ति करते हैं, और कि btw सही जवाब है
बोहेमियन

1
Collections.singletonList(messageBody)

यदि आपको एक आइटम की सूची की आवश्यकता है !

संग्रह से है java.util पैकेज।


1

इसे करने का सबसे अच्छा तरीका:

package main_package;

import java.util.ArrayList;


public class Stackkkk {
    public static void main(String[] args) {
        ArrayList<Object> list = new ArrayList<Object>();
        add(list, "1", "2", "3", "4", "5", "6");
        System.out.println("I added " + list.size() + " element in one line");
    }

    public static void add(ArrayList<Object> list,Object...objects){
        for(Object object:objects)
            list.add(object);
    }
}

बस एक फ़ंक्शन बनाएं जिसमें आपके जितने तत्व हो सकते हैं और उन्हें एक पंक्ति में जोड़ने के लिए कॉल करें।


1
यदि आप सभी परेशानियों से गुजरते हैं तो आप सादा उपयोग करने के बजाय इसे एक टेम्पलेट विधि बना सकते हैं Object
रॉबर्ट

1

यहाँ AbacusUtil द्वारा कोड दिया गया है

// ArrayList
List<String> list = N.asList("Buenos Aires", "Córdoba", "La Plata");
// HashSet
Set<String> set = N.asSet("Buenos Aires", "Córdoba", "La Plata");
// HashMap
Map<String, Integer> map = N.asMap("Buenos Aires", 1, "Córdoba", 2, "La Plata", 3);

// Or for Immutable List/Set/Map
ImmutableList.of("Buenos Aires", "Córdoba", "La Plata");
ImmutableSet.of("Buenos Aires", "Córdoba", "La Plata");
ImmutableSet.of("Buenos Aires", 1, "Córdoba", 2, "La Plata", 3);

// The most efficient way, which is similar with Arrays.asList(...) in JDK. 
// but returns a flexible-size list backed by the specified array.
List<String> set = Array.asList("Buenos Aires", "Córdoba", "La Plata");

घोषणा lar मैं AbacusUtil का डेवलपर हूं।


0

मेरे लिए Arrays.asList () सबसे अच्छा और सुविधाजनक है। मैं हमेशा उस तरह से इनिशियलाइज़ करना पसंद करता हूँ। यदि आप जावा कलेक्शंस में शुरुआती हैं, तो मैं चाहूंगा कि आप ArrayList आरंभीकरण देखें


Arrays.asList () add()विधियों के साथ एक पंक्ति में एक नया ArrayList बनाने से बेहतर क्यों है ?
इगोरगानापोलस्की

0

एक साधारण उपयोगिता फ़ंक्शन क्यों नहीं बनाता है जो ऐसा करता है?

static <A> ArrayList<A> ll(A... a) {
  ArrayList l = new ArrayList(a.length);
  for (A x : a) l.add(x);
  return l;
}

" ll" का अर्थ है "शाब्दिक सूची"।

ArrayList<String> places = ll("Buenos Aires", "Córdoba", "La Plata");

0

दिलचस्प है कि अन्य अतिभारित विधि के साथ कोई एक-लाइनर Stream::collect सूचीबद्ध नहीं है

ArrayList<String> places = Stream.of( "Buenos Aires", "Córdoba", "La Plata" ).collect( ArrayList::new, ArrayList::add, ArrayList::addAll );

-1

वास्तव में, यह एक पंक्ति में करना संभव है:

Arrays.asList(new MyClass[] {new MyClass("arg1"), new MyClass("arg2")})

3
क्या मैं पूछ सकता हूं कि इससे क्या सवाल बनता है? यह उत्तर पहले से ही अन्य उत्तरों द्वारा कई बार कवर किया गया है।
रहस्यपूर्ण

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