Arraylist से Array तक


111

मैं जानना चाहता हूं कि क्या एरेलेस्ट से एरे में बदलना सुरक्षित / उचित है? मेरे पास प्रत्येक पंक्ति एक स्ट्रिंग के साथ एक पाठ फ़ाइल है:

1236
1233
4566
4568
....

मैं उन्हें सरणी सूची में पढ़ना चाहता हूं और फिर मैं इसे ऐरे में परिवर्तित करता हूं। क्या ऐसा करना उचित / कानूनी है?

धन्यवाद


8
आप कर सकते हैं , लेकिन आपने हमें यह बताने के लिए लगभग पर्याप्त जानकारी नहीं दी है कि यह एक अच्छा विचार है या नहीं।
जॉन स्कीट

6
ArrayLists ठीक हैं। एकमात्र कारण जिसे मैं एक ऐरे में परिवर्तित करने के लिए देख सकता हूं, यदि आपको एक ऐसी विधि को कॉल करने की आवश्यकता है जिसे इसकी आवश्यकता है।
माइक जोंस

जवाबों:


214

हाँ यह एक कन्वर्ट करने के लिए सुरक्षित है ArrayListएक करने के लिएArray । क्या यह एक अच्छा विचार है, यह आपके इच्छित उपयोग पर निर्भर करता है। क्या आपको ArrayListप्रदान किए जाने वाले संचालन की आवश्यकता है ? यदि हां, तो इसे रखें ArrayList। और दूर परिवर्तित!

ArrayList<Integer> foo = new ArrayList<Integer>();
foo.add(1);
foo.add(1);
foo.add(2);
foo.add(3);
foo.add(5);
Integer[] bar = foo.toArray(new Integer[foo.size()]);
System.out.println("bar.length = " + bar.length);

आउटपुट

bar.length = 5

अगर ArrayList खाली है तो क्या होगा?
थानोसफिशरमैन

48
फिर यह खाली है।
IMustBeSomeone

1
The method toArray(T[]) in the type ArrayList<Character> is not applicable for the arguments (char[])
एरोन फ्रेंक

75

यह सबसे अच्छा तरीका है (IMHO)।

List<String> myArrayList = new ArrayList<String>();
//.....
String[] myArray = myArrayList.toArray(new String[myArrayList.size()]);

यह कोड भी काम करता है:

String[] myArray = myArrayList.toArray(new String[0]);

लेकिन यह कम प्रभावी है: स्ट्रिंग सरणी दो बार बनाई जाती है: पहली बार शून्य-लंबाई सरणी बनाई जाती है, फिर वास्तविक आकार की सरणी बनाई जाती है, भरी जाती है और वापस लौटा दी जाती है। इसलिए, यदि आप आवश्यक आकार (से list.size()) जानते हैं तो आपको ऐसा एरे बनाना चाहिए जो सभी तत्वों को डालने के लिए पर्याप्त हो। इस मामले में इसे फिर से आवंटित नहीं किया गया है।


4
के बीच अंतर की अच्छी व्याख्या new String[0]औरnew String[size]
Gamliela

4
new String[0]वास्तव में अधिक कुशल है। shipilev.net/blog/2016/arrays-wisdom-ancients
Radiodef

5
ArrayList<String> myArrayList = new ArrayList<String>();
...
String[] myArray = myArrayList.toArray(new String[0]);

क्या यह एक "अच्छा विचार" है वास्तव में आपके उपयोग के मामले पर निर्भर करेगा।


धन्यवाद, सिर्फ जानने के लिए उत्सुक: मुझे सरणी आकार घोषित करने की आवश्यकता नहीं है?
एडी फ्रीमैन

JavaDocs आपके मित्र हैं। यदि पास किया जा रहा सरणी बहुत छोटा है तो एक नया सरणी वापस आ जाता है। विधि का दूसरा संस्करण जो बिना आर्ग के ले जाता हैObject
ब्रायन रोच


1

किसी संग्रह को किसी सरणी में बदलने के लिए दो शैलियों हैं: या तो पूर्व-आकार की सरणी (जैसे c.toArray(new String[c.size()])) का उपयोग करके या खाली सरणी (जैसे c.toArray(new String[0])) का उपयोग करके । पूर्व-आकार के सरणी का उपयोग करने वाले पुराने जावा संस्करणों में अनुशंसित किया गया था, क्योंकि उचित आकार की एक सरणी बनाने के लिए आवश्यक प्रतिबिंब कॉल काफी धीमा था। हालाँकि, OpenJDK 6 के यह कॉल इंट्रिंस हो गया, जिससे पूर्व-आकार वाले संस्करण की तुलना में खाली सरणी संस्करण का प्रदर्शन समान और कभी-कभी और भी बेहतर हो गया। साथ ही प्री-साइज़ ऐरे से गुज़रना समवर्ती या सिंक्रोनाइज़्ड कलेक्शन के लिए खतरनाक है क्योंकि डेटा रेस साइज़ और ऑरेरे कॉल के बीच संभव है, जिसके परिणामस्वरूप एरे के अंत में अतिरिक्त नल हो सकते हैं, अगर ऑपरेशन के दौरान संग्रह समवर्ती रूप से सिकुड़ गया था। आप वर्दी शैली का पालन कर सकते हैं: देर से अपडेट होने के बाद या तो एक खाली सरणी (जो कि आधुनिक जावा में अनुशंसित है) का उपयोग कर रहा है या पूर्व-आकार के सरणी (जो पुराने जावा संस्करणों या तेज़-हॉटस्पॉट आधारित JVMs में तेज़ हो सकता है) का उपयोग कर रहा है


1

यह नए जावा (> जावा 6) के लिए अनुशंसित उपयोग है

String[] myArray = myArrayList.toArray(new String[0]);

पूर्व-आकार की सरणी का उपयोग करने वाले पुराने जावा संस्करणों में सिफारिश की गई थी, क्योंकि उचित आकार की एक सरणी बनाने के लिए आवश्यक प्रतिबिंब कॉल काफी धीमा था। हालाँकि, OpenJDK 6 के देर से अपडेट के बाद यह कॉल आंतरिक रूप से किया गया था, जिससे पूर्व-आकार वाले संस्करण की तुलना में खाली सरणी संस्करण का प्रदर्शन समान और कभी-कभी और भी बेहतर हो गया। साथ ही पूर्व-आकार की सरणी गुजरना समवर्ती या सिंक्रनाइज़ किए गए संग्रह के लिए खतरनाक है क्योंकि डेटा रेस आकार औरArray कॉल के बीच संभव है, जिसके परिणामस्वरूप सरणी के अंत में अतिरिक्त नल हो सकते हैं, यदि संग्रह ऑपरेशन के दौरान समवर्ती रूप से सिकुड़ गया था। यह निरीक्षण एक समान शैली का पालन करने की अनुमति देता है: या तो एक खाली सरणी (जिसे आधुनिक जावा में अनुशंसित किया गया है) का उपयोग करके या पूर्व-आकार के सरणी (जो पुराने जावा संस्करणों या गैर-हॉटस्पॉट आधारित जेवीएम में तेज हो सकता है) का उपयोग कर सकता है।


0

संग्रह इंटरफ़ेस में एक सरणी में एक नया संग्रह परिवर्तित करने के लिए toArray () विधि शामिल है। इस विधि के दो रूप हैं। कोई भी तर्क संस्करण ऑब्जेक्ट सरणी में संग्रह के तत्वों को वापस नहीं करेगा: सार्वजनिक ऑब्जेक्ट [] toArray ()। लौटाया गया सरणी किसी अन्य डेटा प्रकार पर नहीं जा सकता है। यह सबसे सरल संस्करण है। दूसरे संस्करण के लिए आवश्यक है कि आप उस डेटा प्रकार में पास हों, जिस पर आप लौटना चाहते हैं: सार्वजनिक वस्तु [] toArray (ऑब्जेक्ट प्रकार [])।

 public static void main(String[] args) {  
           List<String> l=new ArrayList<String>();  
           l.add("A");  
           l.add("B");  
           l.add("C");  
           Object arr[]=l.toArray();  
           for(Object a:arr)  
           {  
                String str=(String)a;  
                System.out.println(str);  
           }  
      }  

संदर्भ के लिए, इस लिंक को देखें http://techno-terminal.blogspot.in/2015/11/how-to-obtain-array-from-arraylist.html


0

एक दृष्टिकोण लूप के लिए दूसरा जोड़ना होगा जहां मुद्रण लूप के लिए पहले अंदर किया जा रहा है। ऐशे ही:

static String[] SENTENCE; 

public static void main(String []args) throws Exception{

   Scanner sentence = new Scanner(new File("assets/blah.txt"));
   ArrayList<String> sentenceList = new ArrayList<String>();

   while (sentence.hasNextLine())
   {
       sentenceList.add(sentence.nextLine());
   }

   sentence.close();

   String[] sentenceArray = sentenceList.toArray(new String[sentenceList.size()]);
  // System.out.println(sentenceArray.length);
   for (int r=0;r<sentenceArray.length;r++)
   {
       SENTENCE = sentenceArray[r].split("(?<=[.!?])\\s*"); //split sentences and store in array 

       for (int i=0;i<SENTENCE.length;i++)
       {
           System.out.println("Sentence " + (i+1) + ": " + SENTENCE[i]);
       }
   }    

}

0
ArrayList<String> a = new ArrayList<String>();
a.add( "test" );
@SuppressWarnings( "unused")
Object[] array = a.toArray();

यह निर्भर करता है कि आप क्या हासिल करना चाहते हैं अगर आपको सरणी में हेरफेर करने की आवश्यकता है, तो बाद में यह ऐरेलेस्ट में स्ट्रिंग रखने की तुलना में अधिक प्रयास खर्च होगा। आपके पास एक ArrayList के साथ यादृच्छिक अभिगम भी हैlist.get( index );

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