मैं ArrayList <Object> को ArrayList <string> में कैसे बदल सकता हूँ?


94
ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());

मैंने कोशिश की:

ArrayList<String> list2 = (String)list; 

लेकिन इसने मुझे एक जटिल त्रुटि दी।


5
तुम ऐसा क्यों करना चाहते हो। मेरा मतलब है कि यह सुरक्षित नहीं है। उदाहरण पर गौर करें।
1

6
आप सूची में गैर-स्ट्रिंग डाल रहे हैं। यदि आप उन्हें स्ट्रिंग्स होने के लिए मजबूर करते हैं तो आपकी क्या उम्मीद है?
बेन ज़ोटो

5
मेरा मानना ​​है कि आपका मतलब है: ArrayList <string> list2 = (ArrayList <String>) सूची;
कोस्टी सियुडतु

जवाबों:


130

चूंकि यह वास्तव में तार की एक सूची नहीं है, इसलिए सबसे आसान तरीका यह है कि इस पर लूप करें और प्रत्येक आइटम को अपने आप तार की एक नई सूची में परिवर्तित करें:

List<String> strings = list.stream()
   .map(object -> Objects.toString(object, null))
   .collect(Collectors.toList());

या जब आप जावा 8 पर अभी तक नहीं हैं:

List<String> strings = new ArrayList<>(list.size());
for (Object object : list) {
    strings.add(Objects.toString(object, null));
}

या जब आप जावा 7 पर अभी तक नहीं हैं:

List<String> strings = new ArrayList<String>(list.size());
for (Object object : list) {
    strings.add(object != null ? object.toString() : null);
}

ध्यान दें कि आपको इंटरफ़ेस के खिलाफ घोषित किया जाना चाहिए ( java.util.Listइस मामले में), कार्यान्वयन नहीं।


6
मुझे पसंद है कि इस कार्यान्वयन के लिए शून्य मान कैसे संरक्षित हैं।

4
आप का उपयोग करते हैं String.valueOf(object), तुम क्या करने की जरूरत नहीं होगी object != null ? object.toString() : nullबात
user219882

2
@ टॉमस: यह "null"शाब्दिक के बजाय मूल्य के साथ एक स्ट्रिंग जोड़ देगा null। यह व्यवसाय की आवश्यकताओं पर आगे निर्भर करता है कि यह वांछित है या नहीं। मेरे लिए, यह बिल्कुल स्वीकार्य नहीं होगा क्योंकि यह एक संभावित प्रमुख बग का परिचय देता है।
BalusC

1
@ टॉमस: "null"बिल्कुल नहीं है nullnullजावा में एक विशेष अर्थ नहीं है। यह कोई मतलब नहीं है if (item.equals("null"))कि जब उसके लिए जाँच करने के लिए मजबूर किया जाए ।
बालुस सी सी

1
@ टोमस: आप केवल जावा की मजबूत टाइपिंग प्रकृति को हरा रहे हैं। लेकिन जैसा कि कहा गया है, यह व्यवसाय की आवश्यकताओं पर निर्भर करता है कि क्या यह वांछित है। मेरे लिए, यह बस अस्वीकार्य है। जो भी आप चाहते हैं और समय सिखाएगा :)
BalusC

18

ऐसा करना सुरक्षित नहीं है!
सोचो अगर तुम्हारे पास था:

ArrayList<Object> list = new ArrayList<Object>();
list.add(new Employee("Jonh"));
list.add(new Car("BMW","M3"));
list.add(new Chocolate("Twix"));

यह उन वस्तुओं की सूची को किसी भी प्रकार में बदलने के लिए समझ में नहीं आएगा।


1
जब तक उनके पास नहीं है Object#toString() तरीका । हालांकि, मानव प्रस्तुति की तुलना में अन्य उद्देश्यों के लिए एक्स से स्ट्रिंग तक पूरे प्रकार का रूपांतरण वास्तव में बहुत मायने नहीं रखता है।
BalusC

13

यदि आप इसे गंदे तरीके से करना चाहते हैं, तो यह प्रयास करें।

@SuppressWarnings("unchecked")
public ArrayList<String> convert(ArrayList<Object> a) {
   return (ArrayList) a;
}

लाभ: यहां आप सभी वस्तुओं पर ध्यान न देकर समय की बचत करते हैं।

नुकसान: आपके पैर में छेद हो सकता है।


12

अमरूद का उपयोग :

List<String> stringList=Lists.transform(list,new Function<Object,String>(){
    @Override
    public String apply(Object arg0) {
        if(arg0!=null)
            return arg0.toString();
        else
            return "null";
    }
});

11

जावा 8 का उपयोग आप कर सकते हैं:

List<Object> list = ...;
List<String> strList = list.stream()
                           .map( Object::toString )
                           .collect( Collectors.toList() );

10

आप निम्नलिखित के रूप में ऐसा करने के लिए वाइल्डकार्ड का उपयोग कर सकते हैं

ArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list);

8

यहां अमरूद का उपयोग करने का एक और विकल्प है

List<Object> lst ...    
List<String> ls = Lists.transform(lst, Functions.toStringFunction());

5

आपका कोड ArrayList<String> list2 = (String)list;संकलित नहीं करता है क्योंकि list2प्रकार का नहीं है String। लेकिन यह एकमात्र समस्या नहीं है।


0

जावा 8 लैम्ब्डा का उपयोग करना:

ArrayList<Object> obj = new ArrayList<>();
obj.add(1);
obj.add("Java");
obj.add(3.14);

ArrayList<String> list = new ArrayList<>();
obj.forEach((xx) -> list.add(String.valueOf(xx)));

0

Java Generics के साथ X की एक सूची लेता है और T की एक सूची देता है जो X, Sweet को बढ़ाता या कार्यान्वित करता है!

    // the cast is is actually checked via the method API
@SuppressWarnings("unchecked")
public static <T extends X, X> ArrayList<T> convertToClazz(ArrayList<X> from, Class<X> inClazz, Class<T> outClazz) {
    ArrayList<T> to = new ArrayList<T>();
    for (X data : from) {
        to.add((T) data);
    }
    return to;
}

0

एक सरल उपाय:

List<Object> lst  =listOfTypeObject;   
ArrayList<String> aryLst = new ArrayList<String>();
    for (int i = 0; i < lst.size(); i++) {
        aryLst.add(lst.get(i).toString());
    }

नोट: यह तब काम करता है जब सूची में डेटाटाइप स्ट्रिंग के सभी तत्व शामिल होते हैं।

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