मैं जावा में सभी शून्य के साथ एक ArrayList कैसे आरंभ कर सकता हूं?


161

ऐसा लगता है कि यह arraylistअपना काम नहीं कर रहा है:

// presizing 

ArrayList<Integer> list = new ArrayList<Integer>(60);

बाद में जब मैं इसे एक्सेस करने की कोशिश करता हूं:

list.get(5) 

0 वापस करने के बजाय यह IndexOutOfBoundsException को फेंकता है : इंडेक्स 5 लंबाई के लिए सीमा से बाहर 0

क्या सभी तत्वों को एक सटीक आकार के 0 से आरंभ करने का एक तरीका है जैसे कि C ++ क्या करता है?


4
उस कंस्ट्रक्टर का Javadoc निर्दिष्ट करता है कि यह "खाली सूची" बनाता है। यह अपना काम कर रहा है।
कॉलिनड

जवाबों:


429

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

60 शून्य वाले किसी सूची को आरंभ करने के लिए:

List<Integer> list = new ArrayList<Integer>(Collections.nCopies(60, 0));

यदि आप 60 विभिन्न वस्तुओं के साथ एक सूची बनाना चाहते हैं, तो आप स्ट्रीम एपीआई का उपयोग इस Supplierप्रकार कर सकते हैं:

List<Person> persons = Stream.generate(Person::new)
                             .limit(60)
                             .collect(Collectors.toList());

1
यह मेरे समाधान की तुलना में बहुत बेहतर है (यहां तक ​​कि मेरे अपडेट किए गए जो वास्तव में हेहेह काम करता है)। मैं ArrayListइसे हालांकि, और इसके बजाय केवल करने के लिए एक नया बनाने की सिफारिश करेंगे List। यह ओपी के लिए निश्चित रूप से एक निर्णय है।
corsiKa

6
द्वारा दी गई सूची nCopiesअपरिवर्तनीय है, इसलिए एक नया बनाना ArrayListशायद एक अच्छा विचार है।
aioobe

4
सावधान रहें कि जब nCopiesकिसी जटिल वस्तु के साथ उपयोग किया जाता है तो संग्रह को 60 अलग-अलग वस्तुओं के साथ त्वरित नहीं किया जाता है, लेकिन एक ही वस्तु के साथ 60 बार। इसलिए प्राइमैटिक्स के लिए ही इसका इस्तेमाल करें।
membersound

1
@membersound, मैं कई परिदृश्यों के बारे में सोच सकता हूं जहां nCopiesसंदर्भ प्रकारों के साथ उपयोगी है: अपरिवर्तनीय वस्तुएं जैसे कि तार, अशक्त वस्तु पैटर्न, एनम स्थिरांक ... ... वैसे भी, मैंने 60 अलग-अलग ऑब्जेक्ट बनाने के लिए एक समाधान के साथ उत्तर को अपडेट किया।
18.03 को एरियोबे

@aioobe मुझे पता है कि कई परिदृश्य हैं जहाँ ncopies उपयोगी है। मैं इसे जोड़ना चाहता था, जैसा कि मैंने परस्पर वस्तुओं के साथ ncopies की कोशिश की और आश्चर्यचकित था कि यह काम नहीं किया जैसा कि मुझे उम्मीद थी। बस के मामले में किसी को भी एक ही काम की कोशिश करता है। अद्यतन के लिए धन्यवाद!
सदस्य

12
// apparently this is broken. Whoops for me!
java.util.Collections.fill(list,new Integer(0));

// this is better
Integer[] data = new Integer[60];
Arrays.fill(data,new Integer(0));
List<Integer> list = Arrays.asList(data);

2
यह केवल मौजूदा प्रविष्टियों के साथ एक सूची भरता है। यह वांछित तत्वों के साथ इसे आरंभ नहीं करेगा।
व्हाइटफैंग34

यह सूची को 60 शून्य से नहीं भरेगा।
aioobe

यहां तक ​​कि अगर यह 60 वस्तुओं का निर्माण करेगा, जहां इसे कोई भी बनाने की आवश्यकता नहीं है।
कोलिनड डीपी

1
@Frost: यदि आप एक मिल जाएगा IndexOutOfBoundsExceptionके साथList<Integer> list = new ArrayList<Integer>(60); Collections.fill(list, new Integer(0)); list.get(5);
WhiteFang34

1
Arrays.asListएक Listऐसा उत्पादन करता है जो जोड़ने या हटाने की अनुमति नहीं देता है, इसलिए यह वही नहीं है जो ओपी चाहता है। यह काम करेगा यदि आप सभी की जरूरत है set, लेकिन आप उस मामले में सिर्फ एक सरणी का उपयोग करके बेहतर हो सकते हैं।
कॉलिनड

8

60 जो आप पास कर रहे हैं वह आंतरिक भंडारण के लिए प्रारंभिक क्षमता है। यह एक संकेत है कि आप कितना बड़ा सोचते हैं, यह निश्चित रूप से अभी तक सीमित नहीं है। यदि आपको मान निर्धारित करने की आवश्यकता है, तो आपको उन्हें स्वयं सेट करना होगा, जैसे:

for (int i = 0; i < 60; i++) {
    list.add(0);
}

4

जावा 8 कार्यान्वयन ( 60शून्य से आरंभ की गई सूची ) :

List<Integer> list = IntStream.of(new int[60])
                    .boxed()
                    .collect(Collectors.toList());
  • new int[N] - शून्य और लंबाई N से भरा एक सरणी बनाता है
  • boxed() - प्रत्येक तत्व एक पूर्णांक में बॉक्सिंग करता है
  • collect(Collectors.toList()) - धारा के तत्वों को एकत्र करता है

0

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

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