2010-11-23 11 views
25

क्या यह प्राप्त करने का एक बेहतर तरीका है?संग्रह के लिए ऐरे: अनुकूलित कोड

public static List<String> toList(String[] array) { 

    List<String> list = new ArrayList(array.length); 

    for(int i=0; i<array.length; i++) 
     list.add(array[i]); 

    return list; 
} 

नोट: Arrays.asList (क) एक निश्चित-आकार सूची निर्दिष्ट सरणी द्वारा समर्थित देता है। (सरणी में लौटाई गई सूची में "लिखना" में परिवर्तन।)। मुझे वह व्यवहार नहीं चाहिए। मुझे लगता है मेरी समारोह ऊपर है कि नजरअंदाज कि (या मैं गलत कर रहा हूँ?)

तो, यहाँ हम वैकल्पिक पद्धति है:

public static List<String> toList(String[] array) { 

    List<String> list = new ArrayList(array.length); 

    list.addAll(Arrays.asList(array)); 

    return list; 
} 

बस इसे देख, मैं इसे सबसे तेज़ है पर विश्वास नहीं करते पहली विधि

+0

'नोट' अनुभाग में आपका क्या मतलब है? –

+0

इसका मतलब यह है कि मैं वास्तव में क्या कहता हूं: मैं मूल सरणी के माध्यम से लिखने के लिए संग्रह (सूची) में किए गए कोई भी परिवर्तन नहीं चाहता ... – marcolopes

+4

आपको विश्वास नहीं है * यह पहली विधि से तेज़ है? किस पर आधारित? आपको वास्तव में * अपने वास्तविक प्रदर्शन को मापना चाहिए और उन निष्कर्षों के आधार पर निर्णय लेना चाहिए। साथ ही, यदि आप प्रदर्शन के बारे में चिंतित हैं, तो आपको यह पता लगाने के लिए अपने पूरे एप्लिकेशन को प्रोफाइल करने पर विचार करना चाहिए कि * असली * प्रदर्शन बाधाएं कहां हैं। इस विशेष कोड को अनुकूलित करना समय बर्बाद हो सकता है यदि यह कोड कभी शुरू करने की बाधा नहीं था। –

उत्तर

25

से लिया आप बेहतर तरीका से क्या मतलब है:

अधिक पठनीय:

List<String> list = new ArrayList<String>(Arrays.asList(array)); 

कम स्मृति की खपत है, और शायद तेजी से (लेकिन निश्चित रूप से सुरक्षित थ्रेड नहीं):

public static List<String> toList(String[] array) { 
    if (array==null) { 
     return new ArrayList(0); 
    } else { 
     int size = array.length; 
     List<String> list = new ArrayList(size); 
     for(int i = 0; i < size; i++) { 
      list.add(array[i]); 
     } 
     return list; 
    } 
} 

बीटीडब्ल्यू: यहां आपके पहले उदाहरण में एक बग है:

array.length सरणी शून्य होने पर शून्य सूचक अपवाद उठाएगा, इसलिए चेक if (array!=null) पहले किया जाना चाहिए।

+0

हां। मैंने funcion लिखा के बाद सूची आकार शुरू किया है ... आप संभव शून्य सूचक के बारे में सही हैं। भ्रम से बचने के लिए मैं इसे उदाहरण से हटा दूंगा। वैसे भी, बेहतर से मेरा मतलब तेजी से है। – marcolopes

+1

तो, आपके प्रश्न का उत्तर यह है: स्पष्टीकरण फॉर-लूप तेज है। – Ralph

+2

आप नए ArrayList (0) के बजाय [संग्रह .EMPTY_LIST] (http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html#EMPTY_LIST) का उपयोग कर सकते हैं। – Emil

23
Arrays.asList(array);  

उदाहरण:

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

Arraysnew ArrayList(array) उपयोग करता है। लेकिन यह java.util.ArrayList नहीं है। हालांकि यह बहुत समान है। ध्यान दें कि यह कन्स्ट्रक्टर सरणी लेता है और इसे सूची की बैकिंग सरणी के रूप में रखता है। तो यह O(1) है।

यदि आपके पास पहले से ही सूची बनाई गई है, तो Collections.addAll(list, array), लेकिन यह कम कुशल है।

अद्यतन: इस प्रकार आपका Collections.addAll(list, array) एक अच्छा विकल्प बन जाता है। इसका एक रैपर अमरूद Lists.newArrayList(array) है।

1

क्या आपने Arrays.asList() चेक किया है; देख API

6

के बारे में क्या:

List myList = new ArrayList(); 
String[] myStringArray = new String[] {"Java", "is", "Cool"}; 

Collections.addAll(myList, myStringArray); 
5

आप उपयोग कर सकते हैं:

list.addAll(Arrays.asList(array)); 
+0

मेरा मानना ​​है कि यह सही है! लेकिन क्या यह विधि अधिक "कुशल" है? धन्यवाद। – marcolopes

1

हाँ, वहाँ है। आप java.util। * पैकेज से Arrays क्लास का उपयोग कर सकते हैं। तो यह वास्तव में कोड की सिर्फ एक पंक्ति है।

List<String> list = Arrays.asList(array); 
+0

एक ही परिणाम नहीं ...सार्वजनिक स्थैतिक सूची aslist (टी ... ए) निर्दिष्ट सरणी द्वारा समर्थित एक निश्चित आकार की सूची देता है। (सरणी में लौटाई गई सूची में "लिखना" में परिवर्तन।) – marcolopes

1

आप कुछ इस तरह की कोशिश कर सकते हैं:

List<String> list = new ArrayList<String>(Arrays.asList(array)); 

सार्वजनिक ArrayList (संग्रह ग)

आदेश में निर्दिष्ट संग्रह, की तत्वों से युक्त एक सूची निर्माणों वे संग्रह के पुनरावर्तक द्वारा वापस लौटाए जाते हैं। ArrayList उदाहरण में निर्दिष्ट संग्रह का आकार 110% की प्रारंभिक क्षमता है।

here

9

एक और तरीका है यह करने के लिए:

Collections.addAll(collectionInstance,array); 
0

java.util.Collections.addAll(Collection<? super String> c, String... elements) इसके कार्यान्वयन के संदर्भ के आधार पर आपके पहली विधि के समान है, यह कहना है

निर्दिष्ट संग्रह करने के लिए निर्दिष्ट के सभी तत्वों को जोड़ता है । जोड़े जाने वाले तत्वों को अलग-अलग या सरणी के रूप में निर्दिष्ट किया जा सकता है। इस सुविधा विधि का व्यवहार c.addAll (Arrays.asList (तत्व)) के समान है, लेकिन अधिकांश क्रियान्वयन के तहत यह विधि काफी तेजी से चलने की संभावना है।

JDK में इसके कार्यान्वयन है (jdk7)

public static <T> boolean addAll(Collection<? super T> c, T... elements) { 
    boolean result = false; 
    for (T element : elements) 
     result |= c.add(element); 
    return result; 
} 
अपने नमूनों के बीच

तो बेहतर दृष्टिकोण होना चाहिए Collections.addAll(list, array);

जावा 8 बाद से, हम Stream एपीआई जो प्रदर्शन कर सकते हैं का उपयोग कर सकते बेहतर

ईजी: -

String[] array = {"item1", "item2", "item3"}; 

Stream<String> stream = Stream.of(array); 

//if the array is extremely large 
stream = stream.parallel(); 

final List<String> list = stream.collect(Collectors.toList()); 

यदि सरणी बहुत बड़ी है तो हम इसे समानांतर धारा (stream = stream.parallel()) का उपयोग करके समांतर में बैच ऑपरेशन के रूप में कर सकते हैं जो सभी CPUs को कार्य को जल्दी से समाप्त करने के लिए उपयोग करेगा। यदि सरणी लंबाई बहुत छोटी समानांतर धारा अनुक्रमिक धारा से अधिक समय लेती है।

संबंधित मुद्दे