किसी भी लाइन में एक सरणी घोषित करने का कोई तरीका?


616

मान लीजिए कि मेरे पास मेथड () है जो एक तर्क के रूप में स्ट्रिंग्स की एक सरणी लेता है। क्या कोई तरीका है जब मैं कॉल करने पर इस सरणी को लाइन में घोषित कर सकता हूं? इसके बजाय:

String[] strs = {"blah", "hey", "yo"};
m(strs);

क्या मैं इसे केवल एक पंक्ति से बदल सकता हूं, और एक नामित चर घोषित करने से बच सकता हूं जिसका मैं कभी उपयोग नहीं करने जा रहा हूं?


2
एक IDE जो री-फैक्टरिंग का समर्थन करता है, आपको स्वचालित रूप से इन-लाइन strs की अनुमति देगा।
पॉल मैकेंजी

जवाबों:


944
m(new String[]{"blah", "hey", "yo"});

77
बस भविष्य के संदर्भ के लिए, इस प्रकार के सरणी को एक अनाम सरणी के रूप में जाना जाता है (क्योंकि इसका कोई नाम नहीं है)। "अनाम सरणी जावा" की खोज करने से कुछ परिणाम मिलेंगे।
फालना

2
यह कास्टिंग जैसा दिखता है। मुझे लगता है कि मैं इसे कैसे सोचूंगा, इसलिए मुझे इसे एक बार एक ब्लीमून में गूगल करने की आवश्यकता नहीं है।
ArtOfWarfare

यह दुर्लभ उदाहरण है जहां एक कोड-ओनली उत्तर पूरी तरह से स्वीकार्य है, और वास्तव में, शायद बेहतर भी।
मैक्स वॉन हिप्पेल

113

ड्रेमन सही है। आप वार्गर्सm लेने की भी घोषणा कर सकते हैं :

void m(String... strs) {
    // strs is seen as a normal String[] inside the method
}

m("blah", "hey", "yo"); // no [] or {} needed; each string is a separate arg here

19
बहुत अच्छा वाक्यविन्यास, लेकिन इस पद्धति के साथ आपके पास केवल एक सरणी पैरामीटर हो सकता है, और यह अंतिम होना चाहिए। इसलिए, आप ऐसा नहीं कर सकते: void m(String... strs, Integer... intgrs)उदाहरण के लिए।
ब्लूफूट

5
ब्लफूट सही है। लेकिन आप कर सकते हैंvoid m(Integer i, Double d, String... str)
इगोर एस।

@MichaelMyers का क्या अर्थ है(String ... strs)
कसुन सियामबलपिटिया

1
@KasunSiyambalapitiya: मेरे उत्तर के लिंक पर क्लिक करें।
माइकल मायर्स

30

ऐसा करने का एक और तरीका है, यदि आप सूची इनलाइन के रूप में परिणाम चाहते हैं, तो आप इसे इस तरह से कर सकते हैं:

Arrays.asList(new String[] { "String1", "string2" });

38
आप वास्तव में एक सरणी बनाने की जरूरत नहीं है, आप बस कर सकते हैं:Arrays.asList("string1", "string2", ...)
एलियास डोर्नेलेस

2
संभवत: उपयोगी बिंदु: आप यह प्राथमिकताओं के साथ नहीं कर सकते। आप एक एकल तत्व के साथ खत्म हो जाएगा Listकी type[]जहां typeकि आदिम है। उदाहरण के लिए Arrays.asList([some ints])List<int[]>
मोइरा

@ एटनियो कार्लोस: नहीं, यह नहीं है। आप setलौटे पर कॉल कर सकते हैं Listऔर यह एरे को संशोधित करेगा।
होल्गर

17

आप बिना इरिलाइज़र के सीधे आधुनिक जावा में सरणी लिख सकते हैं। आपका उदाहरण अब मान्य है। वैसे भी आमतौर पर पैरामीटर का नाम देना सबसे अच्छा है।

String[] array = {"blah", "hey", "yo"};

या

int[] array = {1, 2, 3};

यदि आपके पास इनलाइन है, तो आपको टाइप घोषित करना होगा:

functionCall(new String[]{"blah", "hey", "yo"});

या varargs (चर तर्क) का उपयोग करें

void functionCall(String...stringArray) {
    // Becomes a String[] containing any number of items or empty
}

functionCall("blah", "hey", "yo");

उम्मीद है कि जावा के डेवलपर्स भविष्य में निहित आरंभ की अनुमति देंगे

अपडेट: कोटलिन उत्तर

कोटलिन ने सरणियों के साथ काम करना इतना आसान बना दिया है! अधिकांश प्रकारों के लिए, बस उपयोग करें arrayOfऔर यह स्पष्ट रूप से प्रकार का निर्धारण करेगा। उन्हें खाली छोड़ने के लिए कुछ भी न करें।

arrayOf("1", "2", "3") // String
arrayOf(1, 2, 3)       // Int
arrayOf(1, 2, "foo")   // Any 
arrayOf<Int>(1, 2, 3)  // Set explict type
arrayOf<String>()      // Empty String array

प्रिमिटिव में उपयोगिता कार्य हैं। उन्हें खाली छोड़ने के लिए कुछ भी न करें।

intArrayOf(1, 2, 3)
charArrayOf()
booleanArrayOf()
longArrayOf()
shortArrayOf()
byteArrayOf()

यदि आपके पास पहले से ही है Collectionऔर इसे एक सरणी इनलाइन में बदलना चाहते हैं, तो बस उपयोग करें:

collection.toTypedArray()

यदि आपको किसी सरणी प्रकार का उपयोग करने की आवश्यकता है, तो उपयोग करें:

array.toIntArray()
array.toLongArray()
array.toCharArray()
...

लेकिन आप ऐसा नहीं कर सकते doSomething({"blah", "hey", "yo"}), जो कि मूल प्रश्न के बारे में पूछ रहा था।
डेविड डेमार

11

आप कहीं एक विधि बना सकते हैं

public static <T> T[] toArray(T... ts) {
    return ts;
}

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

m(toArray("blah", "hey", "yo"));

बेहतर लुक के लिए।


3

मैं जोड़ना चाहूंगा कि सरणी आरंभीकरण सिंटैक्स बहुत रसीला और लचीला है। मैं अपने कोड से डेटा निकालने और इसे कहीं अधिक उपयोग करने योग्य स्थान पर रखने के लिए इसका उपयोग करता हूं।

एक उदाहरण के रूप में, मैंने अक्सर इस तरह के मेनू बनाए हैं:

Menu menu=initMenus(menuHandler, new String[]{"File", "+Save", "+Load", "Edit", "+Copy", ...});

यह मुझे मेनू सिस्टम सेट करने के लिए कोड लिखने के लिए अनुमति देगा। "+" यह उस आइटम को पिछले आइटम के तहत रखने के लिए बताने के लिए पर्याप्त है।

मैं इसे मेन्हैंडलर वर्ग के लिए बाँध सकता है, या तो अपने तरीके को "मेनुफाइल, मेनुफ़ाइलसेव, मेन्युफाइलवॉड, ..." जैसे तरीकों से नामित करके कन्वेंशन का नामकरण कर सकता है और उन्हें प्रतिबिंबित कर सकता है (अन्य विकल्प भी हैं)।

यह सिंटैक्स AMAZINGLY संक्षिप्त मेनू परिभाषा और एक अत्यंत पुन: प्रयोज्य "initMenus" विधि की अनुमति देता है। (फिर भी मैं इसे पुन: उपयोग करने से परेशान नहीं करता क्योंकि यह हमेशा लिखने में मजेदार है और केवल कुछ मिनट + कोड की कुछ पंक्तियाँ लेता है)।

किसी भी समय आप अपने कोड में एक पैटर्न देखते हैं, देखें कि क्या आप इसे कुछ इस तरह से बदल सकते हैं, और हमेशा याद रखें कि सरणी आरंभीकरण वाक्यविन्यास कितना संक्षिप्त है।


5
यह भी varargs के रूप में करना बेहतर होगा। इसके अलावा, जो कोई भी "मस्ती" के लिए टाइपिंग कोड पसंद करता है, वह निराश है! कोडिंग नई समस्याओं को हल करने के बारे में है, टाइपिंग नहीं। ओह रुको, यह जावा ;-)
mjaggard

1
आप सही कह रहे हैं, जब मैंने यह लिखा था तो मैंने varargs का ज्यादा इस्तेमाल नहीं किया था - और जावा में मौजूद varargs के होने से पहले मैंने सरणी इनिशियलाइज़ेशन का इस्तेमाल किया था। एक हिस्सा जो मैं अभी भी ऐरे के लिए पसंद कर रहा हूं, वह यह है कि अगर आप इसे एक आरे के रूप में परिभाषित करते हैं, तो आप इनलाइन डेटा के बजाय फाइल के शीर्ष पर इसे स्थिर बना सकते हैं, और आप इसे एक कॉन्फिगर फाइल में भी निकाल सकते हैं
बिल के

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

2

अन्य विकल्प का उपयोग ArrayUtils.toArray को org.apache.commons.lang3 में करना है

ArrayUtils.toArray("elem1","elem2")

यह एक विकल्प है, हालांकि इसमें स्टैक को जोड़ने वाले अतिरिक्त कार्यात्मक कॉल हैं जो अनावश्यक हैं।
साइबेक्स

1

जैसा कि ड्रेमन कहते हैं, जावा निकटतम इनलाइन सरणियों है, new String[]{"blah", "hey", "yo"}हालांकि एक साफ चाल है जो आपको कुछ ऐसा करने की अनुमति देता है

array("blah", "hey", "yo") प्रकार के साथ स्वचालित रूप से अनुमान लगाया गया।

मैं इनलाइन सरणियों और संग्रह प्रकारों की अनुमति देने के लिए जावा भाषा को बढ़ाने के लिए एक उपयोगी एपीआई पर काम कर रहा हूं। अधिक जानकारी के लिए Google प्रोजेक्ट एस्प्रेसो 4 जे या यहां देखें


9
बस कुछ मुद्दों को यहाँ: 1. कृपया सुनिश्चित करें कि आपके पोस्ट और प्रोफ़ाइल में आप यह स्पष्ट रूप से स्पष्ट कर दें कि आप एस्प्रेसो 4 जे (कृपया हमारे FAQ देखें ) से संबद्ध हैं । कृपया अपनी वेबसाइट को सावधानीपूर्वक पुरानी पोस्टों से लिंक करें ( विशेष रूप से बॉयलरप्लेट इस तरह के और इस एक का जवाब देता है ) - यह बहुत ही स्पैम के रूप में आता है और झंडे उठाता है जो आपके प्रतिनिधि को दांतों से काटेगा।
केव

@ केव आह सॉरी। मैंने स्पष्ट किया है कि मैं अब एस्प्रेसो 4 जे परियोजना का विकास कर रहा हूँ :)
जोनाथन वेदरहेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.