जावा में 'ArrayList <string>' String [] 'में परिवर्तित करना


1022

मैं जावा में किसी ArrayList<String>ऑब्जेक्ट को String[]सरणी में कैसे बदल सकता हूं ?


2
Have इस जवाब किए गए इस पुस्तक का नूतन दृष्टिकोण के साथ JDK-11 के लिए एक नया एक समान रूप से performant एपीआई शुरू करने toArray(T[])और करने के लिए वाक्य रचना में इसी तरह की Stream.toArray
नमन

जवाबों:


1787
List<String> list = ..;
String[] array = list.toArray(new String[0]);

उदाहरण के लिए:

List<String> list = new ArrayList<String>();
//add some stuff
list.add("android");
list.add("apple");
String[] stringArray = list.toArray(new String[0]);

toArray()किसी भी तर्क रिटर्न गुजर बिना विधि Object[]। तो आपको एक तर्क के रूप में एक सरणी पास करना होगा, जो सूची से डेटा से भर जाएगा, और वापस आ जाएगा। आप एक खाली सरणी भी पास कर सकते हैं, लेकिन आप वांछित आकार के साथ एक सरणी भी पास कर सकते हैं।

महत्वपूर्ण अद्यतन : मूल रूप से ऊपर उपयोग किए गए कोड new String[list.size()]। हालांकि, इस ब्लॉगपोस्ट से पता चलता है कि जेवीएम अनुकूलन के कारण, new String[0]अब उपयोग करना बेहतर है।


16
क्या तर्क के आकार से कोई फर्क पड़ता है?
थोरबजोरन रेव एंडरसन

37
यह एक और एरे इंस्टेंटेशन बचाता है
Bozho

59
यह बताता है कि शून्य-लंबाई वाला सरणी प्रदान करना, यहां तक ​​कि इसे बनाना और इसे फेंक देना, सही आकार के सरणी को आवंटित करने की तुलना में औसतन तेज है। बेंचमार्क और स्पष्टीकरण के लिए यहां देखें: shipilev.net/blog/2016/arrays-wisdom-ancients
स्टुअर्ट मार्क्स

2
(क्षमा करें। शाब्दिक प्रश्न। उत्तर निश्चित रूप से है, क्योंकि जावा वास्तविक जेनरिक नहीं करता है; यह ज्यादातर उन्हें ऑब्जेक्ट कास्टिंग द्वारा
फेक करता है

2
@lyuboslavkanev समस्या यह है कि जावा में सामान्य प्रकार का होना वास्तव में उस प्रकार के आधार पर वस्तुओं को बनाने के लिए पर्याप्त नहीं है; एक सरणी भी नहीं (जो हास्यास्पद है, क्योंकि यह किसी भी प्रकार के लिए काम करना चाहिए )। यह सब उसके साथ किया जा सकता है, जहां तक ​​मैं देख सकता हूं, कास्टिंग है। वास्तव में, यहां तक ​​कि प्रकार की वस्तुओं को बनाने के लिए, आपके पास वास्तविक Classवस्तु होनी चाहिए, जो सामान्य प्रकार से प्राप्त करने के लिए पूरी तरह से असंभव लगती है। इसका कारण, जैसा कि मैंने कहा, यह है कि पूरा निर्माण नकली है; यह सब सिर्फ आंतरिक रूप से ऑब्जेक्ट के रूप में संग्रहीत है।
Nyerguds 7

170

जावा 8 में एक विकल्प:

String[] strings = list.stream().toArray(String[]::new);

जावा 11+:

String[] strings = list.toArray(String[]::new);

25
या कोई लाभ?
जेम्स वाटकिंस

1
मैं उस सिंटैक्स को पसंद करूंगा, लेकिन इंटेलीज ने इसके साथ एक कंपाइलर त्रुटि प्रदर्शित की, "T [] एक कार्यात्मक इंटरफ़ेस नहीं है।"
ग्लेन मज़ज़ा

3
@GlenMazza आप केवल toArrayएक Streamवस्तु पर उपयोग कर सकते हैं । यह संकलन त्रुटि तब हो सकती है यदि आप ए का उपयोग करके स्ट्रीम को कम करते हैं Collectorsऔर फिर लागू करने का प्रयास करते हैं toArray
उदारा बंटोटा

39

आप इसके लिए toArray()विधि का उपयोग कर सकते हैं List:

ArrayList<String> list = new ArrayList<String>();

list.add("apple");
list.add("banana");

String[] array = list.toArray(new String[list.size()]);

या आप मैन्युअल रूप से तत्वों को एक सरणी में जोड़ सकते हैं:

ArrayList<String> list = new ArrayList<String>();

list.add("apple");
list.add("banana");

String[] array = new String[list.size()];

for (int i = 0; i < list.size(); i++) {
    array[i] = list.get(i);
}

उम्मीद है की यह मदद करेगा!


30
ArrayList<String> arrayList = new ArrayList<String>();
Object[] objectList = arrayList.toArray();
String[] stringArray =  Arrays.copyOf(objectList,objectList.length,String[].class);

CopyOf, ArrayList से सरणियों का उपयोग भी किया जा सकता है।


4
ऊंट का सुझाव दें ताकि "ऑब्जेक्टलिस्ट = ..." और "स्ट्रिंगअरे" हो। इसके अलावा, यह Arrays.copyOf है ... राजधानी ओ।
जेसन वेडन

1
list.toArray () आंतरिक रूप से Arrays.copyOf ()
डेविड

25

Java-11 से शुरू, कोई वैकल्पिक रूप से एपीआई Collection.toArray(IntFunction<T[]> generator)का उपयोग कर सकता है जैसे:

List<String> list = List.of("x","y","z");
String[] arrayBeforeJDK11 = list.toArray(new String[0]);
String[] arrayAfterJDK11 = list.toArray(String[]::new); // similar to Stream.toArray

10

जावा 8 में:

String[] strings = list.parallelStream().toArray(String[]::new);

12
यह वास्तव में पहले से ही इस जवाब में निहित है । शायद इसे पूरी तरह से नए के बजाय एक उत्तर के रूप में संपादित करें।
नदी

11
parallelStream()इसके बजाय बस क्यों stream()?
योरी एन।

7

जावा 8 में, इसका उपयोग करके किया जा सकता है

String[] arrayFromList = fromlist.stream().toArray(String[]::new);

6

जेनेटिक्स समाधान किसी List<Type>को गुप्त करने के लिए String []:

public static  <T> String[] listToArray(List<T> list) {
    String [] array = new String[list.size()];
    for (int i = 0; i < array.length; i++)
        array[i] = list.get(i).toString();
    return array;
}

नोट आपको override toString()विधि करनी चाहिए ।

class Car {
  private String name;
  public Car(String name) {
    this.name = name;
  }
  public String toString() {
    return name;
  }
}
final List<Car> carList = new ArrayList<Car>();
carList.add(new Car("BMW"))
carList.add(new Car("Mercedes"))
carList.add(new Car("Skoda"))
final String[] carArray = listToArray(carList);

5
List <String> list = ...
String[] array = new String[list.size()];
int i=0;
for(String s: list){
  array[i++] = s;
}

13
यह काम करता है, लेकिन सुपर कुशल नहीं है, और अतिरिक्त कोड के साथ स्वीकृत जवाब में कार्यक्षमता को डुप्लिकेट करता है।
एलन डेलिमोन

5

यदि डेटा का कुछ अतिरिक्त हेरफेर वांछित है, जिसके लिए उपयोगकर्ता एक फ़ंक्शन चाहता है, तो यह दृष्टिकोण सही नहीं है (क्योंकि इसमें तत्व के वर्ग को दूसरे पैरामीटर के रूप में पारित करने की आवश्यकता है), लेकिन काम करता है:

आयात java.util.ArrayList; आयात java.lang.reflect.Array;

public class Test {
  public static void main(String[] args) {
    ArrayList<Integer> al = new ArrayList<>();
    al.add(1);
    al.add(2);
    Integer[] arr = convert(al, Integer.class);
    for (int i=0; i<arr.length; i++)
      System.out.println(arr[i]);
  }

  public static <T> T[] convert(ArrayList<T> al, Class clazz) {
    return (T[]) al.toArray((T[])Array.newInstance(clazz, al.size()));
  }
}

5

यदि आपका एप्लिकेशन पहले से ही Apache Commons lib का उपयोग कर रहा है, तो आप हर बार एक नया खाली सरणी नहीं बनाने के लिए स्वीकृत उत्तर को थोड़ा संशोधित कर सकते हैं:

List<String> list = ..;
String[] array = list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);

// or if using static import
String[] array = list.toArray(EMPTY_STRING_ARRAY);

विभिन्न प्रकारों के कुछ और प्रचारित खाली सरणियाँ हैं ArrayUtils

इसके अलावा, हम JVM को इस तरह से हमारे लिए खाली सरणी बनाने के लिए ट्रिक कर सकते हैं:

String[] array = list.toArray(ArrayUtils.toArray());

// or if using static import
String[] array = list.toArray(toArray());

लेकिन इस तरह से वास्तव में कोई फायदा नहीं है, सिर्फ स्वाद की बात है, आईएमओ।


5

आप निम्न Iterator<String>तत्वों का उपयोग कर सकते हैं ArrayList<String>:

ArrayList<String> list = new ArrayList<>();
String[] array = new String[list.size()];
int i = 0;
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); i++) {
    array[i] = iterator.next();
}

अब आप तत्वों को String[]किसी भी लूप का उपयोग करने से रोक सकते हैं ।


मैंने नीचे लिखा है: 1. जेनेरिक का कोई उपयोग नहीं जो आपको मजबूर करता है। 2. .toString()जहां कोई स्पष्ट कलाकारों की आवश्यकता होगी, का उपयोग करना, 3. आप वेतन वृद्धि भी नहीं करते हैं i, और 4. whileबेहतर होगा कि इसकी जगह ए for। सुझाया गया कोड:ArrayList<String> stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator<String> it = stringList.iterator(); it.hasNext(); i++) { stringArray[i] = it.next(); }
ओलिवियर ग्रेगोइरे

ठीक है, मैं अब समझ गया। धन्यवाद।
वत्सल चावड़ा

खैर, आदर्श रूप से, आपको उन टिप्पणियों को शामिल करने के लिए अपने कोड को संपादित करना चाहिए (यदि आप सोचते हैं कि वे आपके उत्तर के लिए अच्छे हैं!)। कोड को अपरिवर्तित रहते हुए मैं अपने डाउनवोट को हटाने पर विचार नहीं करूंगा।
ओलिवियर ग्रेगोइरे

मैं यहां नया हूं, इसलिए मुझे अभी तक नहीं पता है कि चीजें यहां कैसे काम करती हैं। हालाँकि, आपकी मदद दोस्त की सराहना करते हैं।
वत्सल चावड़ा

यह काफी बेहतर है! मैंने बस थोड़ा सा संपादित किया है, लेकिन आपने अभी अनुभव किया है कि यह कैसे काम करता है: उत्तर प्रदान करें, उन्हें सुधारें, लॉरेल प्राप्त करें;)
ओलिवियर ग्राईगोइरे


4
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    String [] strArry= list.stream().toArray(size -> new String[size]);

प्रति टिप्पणियों में, मैंने यह समझाने के लिए एक अनुच्छेद जोड़ा है कि रूपांतरण कैसे काम करता है। सबसे पहले, सूची एक स्ट्रिंग स्ट्रीम में बदल जाती है। तब यह स्ट्रीम में तत्वों को एक ऐरे में बदलने के लिए Stream.toArray का उपयोग करता है। "आकार -> नया स्ट्रिंग [आकार]" के ऊपर अंतिम कथन में वास्तव में एक इंटफ़ंक्शन फ़ंक्शन है जो स्ट्रिंग स्ट्रीम के आकार के साथ स्ट्रिंग सरणी आवंटित करता है। कथन के समान है

IntFunction<String []> allocateFunc = size -> { 
return new String[size];
};   
String [] strArry= list.stream().toArray(allocateFunc);

4
यह उत्तर किस मूल्य को जोड़ता है? ऐसा लगता है कि यह सवाल का जवाब दिए बिना ही अन्य उत्तरों को दोहराता है।
रिचर्ड

2

आप इस विधि का उपयोग करके सूची को स्ट्रिंग सरणी में परिवर्तित कर सकते हैं:

 Object[] stringlist=list.toArray();

पूरा उदाहरण:

ArrayList<String> list=new ArrayList<>();
    list.add("Abc");
    list.add("xyz");

    Object[] stringlist=list.toArray();

    for(int i = 0; i < stringlist.length ; i++)
    {
          Log.wtf("list data:",(String)stringlist[i]);
    }

1
private String[] prepareDeliveryArray(List<DeliveryServiceModel> deliveryServices) {
    String[] delivery = new String[deliveryServices.size()];
    for (int i = 0; i < deliveryServices.size(); i++) {
        delivery[i] = deliveryServices.get(i).getName();
    }
    return delivery;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.