जावा में ऑब्जेक्ट ऐरे को स्ट्रिंग ऐरे में कैसे बदलें


244

मैं ऑब्जेक्ट कोड को स्ट्रिंग सरणी में बदलने के लिए निम्न कोड का उपयोग करता हूं:

Object Object_Array[]=new Object[100];
// ... get values in the Object_Array

String String_Array[]=new String[Object_Array.length];

for (int i=0;i<String_Array.length;i++) String_Array[i]=Object_Array[i].toString();

लेकिन मुझे आश्चर्य है कि ऐसा करने का एक और तरीका है, कुछ इस तरह:

String_Array=(String[])Object_Array;

लेकिन यह रनटाइम त्रुटि का कारण होगा: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

इसे करने का सही तरीका क्या है?


3
मुझे वैक्सिंग का जवाब सबसे अच्छा लगता है: स्ट्रिंग [] stringArray = Arrays.copyOf (objectArray, objectArray.length, String [] वर्ग); यह बहुत संक्षिप्त है और काम करता है। मैंने गिना कि उसके उत्तर और मेरे वर्तमान दृष्टिकोण दोनों के लिए कितना समय लगता है, वे बहुत अधिक समान हैं।
फ्रैंक

जवाबों:


381

दूसरा विकल्प System.arraycopy:

String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);

59
केवल जावा 1.6 और उससे अधिक पर
newacct

10
मानव संसाधन विकास मंत्री। मुझे यह काम करने के लिए नहीं मिला, जहां मूल प्रश्न में लंबे समय तक फॉर्म का उदाहरण काम करता है। यह java.lang.ArrayStoreException फेंकता है। मैं अपने सामान्य प्रकार वाले जेनेरिक ArrayList पर toArray विधि से ऑब्जेक्ट सरणी प्राप्त कर रहा हूं। क्या इससे जेनरिक या कुछ और काम करने की उम्मीद नहीं है?
इयान वरले

4
@ इयान, मुद्दा यह है कि objectArray में ऑब्जेक्ट्स नहीं होते हैं स्ट्रिंग्स (देखें mmyers मेरे जवाब पर टिप्पणी करते हैं जो उसी समस्या से ग्रस्त हैं)।
यिशै जूल

3
मैंने केवल इस दृष्टिकोण की कोशिश की और, कम से कम मेरे मामले में, मुझे पता चला कि प्रदर्शन उतना अच्छा नहीं है जितना कि पुनरावृति करके स्वयं सरणी का निर्माण करना। (हालांकि बहुत बुरा है, मुझे यह एक लाइनर के रूप में पसंद आया!)
मधुप

1
@ मडप - बहुत लंबा एक लाइनर। एक विधि में लपेटो शायद।
मास्टरजेओ 2

72

जावा 8 में:

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

अन्य प्रकारों की एक सरणी बदलने के लिए:

String[] strings = Arrays.stream(obj).map(Object::toString).
                   toArray(String[]::new);

2
यह सुंदरता का एक काम है और सौंदर्य की दृष्टि से गैर-स्ट्रिंग ऑब्जेक्ट एरे को उनके स्टर्लिंग समकक्षों के एक सरणी में बदलने में सक्षम होने की आवश्यकता को संतुष्ट करता है। वर्तमान में स्वीकृत उत्तर इसको पूरा नहीं करता है।
b4n4n4p4nd4

यह काम करता है लेकिन अगर आपकी सूची में नल हैं तो आपको NullPointerException मिल जाएगी। उस मुद्दे को देखने के लिए देखें: stackoverflow.com/questions/4581407/…
टोनी फलाबेला

61

System.arraycopy शायद सबसे कुशल तरीका है, लेकिन सौंदर्यशास्त्र के लिए, मैं पसंद करूंगा:

 Arrays.asList(Object_Array).toArray(new String[Object_Array.length]);

10
केवल तभी काम करता है यदि ऑब्जेक्ट सभी स्ट्रिंग्स हैं; यदि वह नहीं हैं तो भी उनका वर्तमान कोड काम करता है।
माइकल मायर्स

अच्छी बात। मैं समझ गया था कि स्ट्रिंग को केवल एक स्ट्रिंग के लिए कास्टिंग करने का एक तरीका है, न कि वास्तव में वस्तुओं को किसी और चीज़ से बदलने का इरादा। यदि आपको वही करना है, तो लूपिंग एकमात्र तरीका है।
यिशै

यह एंड्रॉइड 2.3.3 में काम नहीं करता है .. यह मुझे यह कहते हुए एक त्रुटि देता है कि कॉपीफ़ पद्धति को परिभाषित नहीं किया गया है। मैंने सभी सही फ़ाइलों को आयात किया (ctrl + shift + I) .. लेकिन यह अभी भी काम नहीं करता है।
user590849

3
@ user590849, मेरा उत्तर उपयोग नहीं करता है copyof। क्या आप किसी अन्य उत्तर का संदर्भ दे रहे हैं?
यिशै

50

मैं देखता हूं कि कुछ समाधान प्रदान किए गए हैं, लेकिन कोई कारण नहीं है इसलिए मैं इस बारे में विस्तार से बताऊंगा क्योंकि मेरा मानना ​​है कि यह जानना महत्वपूर्ण है कि आप क्या गलत कर रहे थे कि बस "कुछ" प्राप्त करने के लिए जो दिए गए उत्तरों से काम करता है।

सबसे पहले, देखते हैं कि ओरेकल को क्या कहना है

 * <p>The returned array will be "safe" in that no references to it are
 * maintained by this list.  (In other words, this method must
 * allocate a new array even if this list is backed by an array).
 * The caller is thus free to modify the returned array.

यह महत्वपूर्ण नहीं लग सकता है, लेकिन जैसा कि आप देखेंगे कि यह है ... तो निम्नलिखित पंक्ति क्या विफल हो जाती है? सूची में सभी ऑब्जेक्ट स्ट्रिंग हैं लेकिन यह उन्हें परिवर्तित नहीं करता है, क्यों?

List<String> tList = new ArrayList<String>();
tList.add("4");
tList.add("5");
String tArray[] = (String[]) tList.toArray();   

शायद, आप में से बहुत से लोग सोचते होंगे कि यह कोड समान है, लेकिन ऐसा नहीं है।

Object tSObjectArray[] = new String[2];
String tStringArray[] = (String[]) tSObjectArray;

जब वास्तव में लिखित कोड कुछ ऐसा कर रहा हो। जावदोक कह रहा है! यह एक नई सरणी पैदा करेगा, यह वस्तुओं का क्या होगा !!!

Object tSObjectArray[] = new Object[2];
String tStringArray[] = (String[]) tSObjectArray;   

इसलिए tList.toArray एक ऑब्जेक्ट्स को त्वरित कर रहा है न कि स्ट्रिंग्स ...

इसलिए, इस धागे में प्राकृतिक समाधान का उल्लेख नहीं किया गया है, लेकिन यह है कि ओरेकल की सिफारिश निम्नलिखित है

String tArray[] = tList.toArray(new String[0]);

आशा है कि यह पर्याप्त स्पष्ट है।


थोड़ा सुधार प्रदर्शन बुद्धिमान: स्ट्रिंग tArray [] = tList.toArray (नया स्ट्रिंग [tList.size ()]); अन्यथा सरणी को फिर से आकार देना होगा ...
लोनजैक

1
अच्छे खर्च। बस एक और बात, अगर मेमोरी की खपत या प्रदर्शन एक मुद्दा है, तो सरणी को डुप्लिकेट न करें। या तो स्ट्रिंग में एक तत्व डाली जब भी आप इसकी आवश्यकता है (String)Object_Array[i]या Object_Array[i].toString()या एक स्ट्रिंग सरणी के रूप में सरणी आवंटित Object Object_Array[]=new String[100];... मूल्यों को प्राप्त ... तो डाली String_Array=(String[])Object_Arrayजो अब काम करता है।
सोलोस्ट्रैन 14

1
यह ArrayStoreException
iltaf खालिद

7

गूगल कलेक्शन फ्रेमवर्क एक अच्छी ट्रांसफॉर्मेशन विधि का उद्धरण देता है, जिससे आप अपनी वस्तुओं को स्ट्रिंग्स में बदल सकते हैं। केवल नकारात्मक पक्ष यह है कि इसे Iterable से Iterable तक होना है लेकिन यह वह तरीका है जिससे मैं इसे करूंगा:

Iterable<Object> objects = ....... //Your chosen iterable here
Iterable<String> strings = com.google.common.collect.Iterables.transform(objects, new Function<Object, String>(){
        String apply(Object from){
             return from.toString();
        }
 });

यह आपको सरणियों का उपयोग करने से दूर ले जाता है, लेकिन मुझे लगता है कि यह मेरा पसंदीदा तरीका होगा।


1
@ यशै: नहीं, सरणियाँ Iterable को लागू नहीं करती हैं। उनके ऊपर पुनरावृति को विशेष रूप से जेएलएस में परिभाषित किया गया है
नया

@newacct, काफी सच है, मेरा मतलब है कि सरणियों को आसानी से एक Iterable (Arrays.asList ()) में लपेटा जा सकता है। मुझे नहीं पता कि यह इस तरह क्यों निकला।
यिशै जूल

5

यदि आप अपने एरे में ऑब्जेक्ट्स का स्ट्रिंग प्रतिनिधित्व प्राप्त करना चाहते हैं, तो हाँ, इसे करने का कोई और तरीका नहीं है।

यदि आप जानते हैं कि आपके ऑब्जेक्ट ऐरे में स्ट्रिंग्स शामिल हैं, तो आप भी कर सकते हैं (कॉलिंग की स्ट्रिंग को स्ट्रिंग) ():

for (int i=0;i<String_Array.length;i++) String_Array[i]= (String) Object_Array[i];

एक ही मामला है जब आप कास्ट का उपयोग कर सकते थे स्ट्रिंग [] Object_Array के अगर यह संदर्भ वास्तव में स्ट्रिंग [] के रूप में परिभाषित किया जाएगा, उदाहरण के लिए यह काम करेगा:

    Object[] o = new String[10];
    String[] s = (String[]) o;

5

यह एक अच्छा है, लेकिन वर्ग कोष्ठक के कारण मिमीयर्स के रूप में काम नहीं किया गया है:

Arrays.toString(objectArray).split(",")

यह एक बदसूरत है, लेकिन काम करता है:

Arrays.toString(objectArray).replaceFirst("^\\[", "").replaceFirst("\\]$", "").split(",")

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


1
दिलचस्प सुझाव, लेकिन आपको पहले और अंतिम तत्वों पर [और] को हटाना होगा।
माइकल मायर्स

1
भव्य जब तक यह काम करता है :)
AZ_

2
यह काम नहीं करता है अगर किसी स्ट्रिंग में अल्पविराम (,)
एंड्रियास बर्जर

2

आपके विचार के लिए, वास्तव में आप सफलता के करीब पहुंच रहे हैं, लेकिन अगर आप ऐसा करते हैं तो यह ठीक होना चाहिए:

for (int i=0;i<String_Array.length;i++) String_Array[i]=(String)Object_Array[i];

BTW, Arrays उपयोगिता विधि का उपयोग करना काफी अच्छा है और कोड को सुरुचिपूर्ण बनाते हैं।



1

आप टाइप-कन्वर्टर का उपयोग कर सकते हैं । तार के किसी भी प्रकार के सरणी को बदलने के लिए आप अपने स्वयं के कनवर्टर को पंजीकृत कर सकते हैं:

 TypeConverter.registerConverter(Object[].class, String[].class, new Converter<Object[], String[]>() {

        @Override
        public String[] convert(Object[] source) {
            String[] strings = new String[source.length];
            for(int i = 0; i < source.length ; i++) {
                strings[i] = source[i].toString();
            }
            return strings;
        }
    });

और इसका उपयोग करें

   Object[] objects = new Object[] {1, 23.43, true, "text", 'c'};
   String[] strings = TypeConverter.convert(objects, String[].class);

0

किसी भी सिरदर्द के बिना आसानी से बदलें किसी भी वस्तु सरणी को स्ट्रिंग सरणी में बदलें वस्तु ड्राइवएक्स [] = {1,2};

    for(int i=0; i<drive.length ; i++)
        {
            Str[i]= drivex[i].toString();
            System.out.println(Str[i]); 
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.