कैसे सेट करें <स्ट्रींग> को स्ट्रिंग [] में कन्वर्ट करने के लिए?


281

मैं एक से String[]बाहर निकलने की जरूरत है Set<String>, लेकिन मुझे नहीं पता कि यह कैसे करना है। निम्नलिखित विफल रहता है:

Map<String, ?> myMap = gpxlist.getAll();
Set<String> myset = myMap.keySet();
String[] GPXFILES1 = (String[]) myset.toArray(); // Here it fails.

मैं इसे कैसे ठीक कर सकता हूं ताकि यह काम करे?


5
जिस toArray()विधि के साथ स्पष्ट रूप से जावदोक में उल्लेख किया गया है।
लोर्ने

1
जावा 8 समाधान: stackoverflow.com/questions/5982447/…
akhil_mittal

जावा 11: नई toArray()डिफ़ॉल्ट विधि stackoverflow.com/a/32179686/1216775
akhil_mittal

जवाबों:


461

Set#toArray(T[])उसी आकार के टाइप किए गए सरणी तर्क लेने की विधि का उपयोग करें ।

String[] GPXFILES1 = myset.toArray(new String[myset.size()]);

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

का सोर्स कोडAbstractCollection#toArray() भी देखें ।


5
आप आकार की सारणी को भी निर्दिष्ट कर सकते हैं 0: String[] GPXFILES1 = myset.toArray(new String[0]);
sactiw

1
@ संक्टि: यह पहले से ही अन्य उत्तर द्वारा कवर किया गया है। अन्य उत्तर पर टिप्पणी पढ़ें कि यह क्यों अनुशंसित नहीं है।
बालुस

8
Java 7 से हम उपयोग कर सकते हैं String[] GPXFILES1 = myset.toArray(new String[0])और इसकी अनुशंसा की जाती है। उत्तर को अपडेट करें। "OpenJDK 6 के देर से अपडेट के बाद से यह कॉल आंतरिक था, खाली सरणी संस्करण के प्रदर्शन को और पहले के आकार की तुलना में कभी-कभी और भी बेहतर बनाता है। पूर्व-आकार की सरणी से गुजरना समवर्ती या सिंक्रनाइज़ संग्रह के लिए खतरनाक है। यदि आकार संग्रह के दौरान समाप्‍त रूप से अतिरिक्त नल में हो सकता है, तो ऑपरेशन और आकार के बीच एक डेटा रेस संभव है, अगर संग्रह ऑपरेशन के दौरान समवर्ती रूप से सिकुड़ गया था। " - जावा समुदाय द्वारा उद्धृत।
चैतन्य

6
पहले इस उत्तर को एनकाउंटर करना और फिर अधिक शोध करना, इस बात का समर्थन करने के लिए कुछ सबूत हैं कि उपरोक्त टिप्पणी सही है; और स्वीकृत उत्तर पुराना है। आप क्या करेंगे के लिए ये उदाहरण लिंक लें: stackoverflow.com/questions/9863742/… , और उस SO पोस्ट से एक लिंक shipilev.net/blog/2016/arrays-wisdom-ancients
RMSD

60

जावा 11

इंटरफ़ेस toArrayमें नई डिफ़ॉल्ट विधि Collectionसंग्रह के तत्वों को वांछित रनटाइम प्रकार के एक नए बनाए गए सरणी में स्थानांतरित करने की अनुमति देती है। यहIntFunction<T[]> generator तर्क के रूप में लेता है और इसका उपयोग किया जा सकता है:

 String[] array = set.toArray(String[]::new);

पहले से ही एक समान विधि है Collection.toArray(T[])और इस जोड़ का मतलब है कि अब हम पास नहीं कर पाएंगेnull तर्क के रूप में क्योंकि उस मामले में विधि का संदर्भ अस्पष्ट होगा। लेकिन यह अभी भी ठीक है क्योंकि दोनों ही तरीके एनपीई को वैसे भी फेंक देते हैं।

जावा 8

Java 8 में हम स्ट्रीम API का उपयोग कर सकते हैं:

String[] array = set.stream().toArray(String[]::new);

हम ओवरराइड () के अतिभारित संस्करण का उपयोग भी कर सकते हैं जो निम्नानुसार हैIntFunction<A[]> generator :

String[] array = set.stream().toArray(n -> new String[n]);

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


आपको stream()उपयोग करने की आवश्यकता नहीं है toArray()। यह हो सकता हैset.toArray(new String[0])
जैकब पॉम्य्कोला

1
@ JakubPomykała वास्तव में अच्छा नहीं है। जब आप गलत आकार की एक सरणी देते हैं, तो आंतरिक रूप से उस फ़ंक्शन को एक सरणी सही आकार प्राप्त करने के लिए प्रतिबिंब का उपयोग करना पड़ता है। यदि इस विधि की आवश्यकता है, तो बस करेंset.toArray(new String[set.size()]);
Debosmit Ray

42

उपयोग toArray (टी [] क) विधि:

String[] array = set.toArray(new String[0]);

26
जब आप बहुत छोटे आकार की सरणी () को पास करते हैं, तोAAray () विधि में प्रतिबिंब का उपयोग करके सही आकार का एक नया सरणी बनाना होता है। कम से कम संग्रह के आकार की एक सरणी में गुजरने की तुलना में इसका प्रदर्शन काफी खराब है। इसलिए स्वीकार किए गए उत्तर के रूप में [0]प्रतिस्थापित किया जाना चाहिए [myset.size()]
k2col

10
@ k2col ऐसा लगता है कि अब set.toArray(new String[0])इससे बेहतर परफॉमेंस हैset.toArray(new String[set.size()]
Xam

1
जावा 7 के बाद से यह पसंदीदा तरीका है। इस टिप्पणी को देखें ।
acdcjunior


2

जावा 11 में हम Collection.toArray(generator)विधि का उपयोग कर सकते हैं । निम्न कोड स्ट्रिंग का एक नया सरणी बनाएगा:

Set<String> set = Set.of("one", "two", "three");
String[] array = set.toArray(String[]::new)

देखें: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collection.html#toArray(java.util.function.ntFunction)


1
Set<String> stringSet= new HashSet<>();
String[] s = (String[])stringSet.toArray();

0

मैं उसी स्थिति का सामना कर रहा था।

मुझे उन संरचनाओं की घोषणा करना शुरू करना चाहिए जिनकी मुझे आवश्यकता है:

Set<String> myKeysInSet = null; String[] myArrayOfString = null;

मेरे मामले में, मेरे पास एक JSON ऑब्जेक्ट है और मुझे इस JSON में सभी कुंजियों को स्ट्रिंग की एक सरणी में संग्रहीत करने की आवश्यकता है। GSON लाइब्रेरी का उपयोग करते हुए , मैं JSON.keySet का उपयोग करता हूं () कुंजी प्राप्त करने और अपने सेट पर जाने के लिए:

myKeysInSet = json_any.keySet();

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

myArrayOfString = myKeysInSet.toArray(new String[myKeysInSet.size()]);

StackOverflow में यह मेरा पहला उत्तर था। किसी भी त्रुटि के लिए क्षमा करें: डी

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