कैसे एक वैरिएग विधि पैरामीटर के लिए एक ArrayList पास करने के लिए?


236

मूल रूप से मेरे पास स्थानों का एक सरणी है:

ArrayList<WorldLocation> locations = new ArrayList<WorldLocation>();

इसके नीचे मैं निम्नलिखित विधि कहता हूं:

.getMap();

getMap () विधि में पैरामीटर हैं:

getMap(WorldLocation... locations)

मुझे जो समस्या हो रही है, मुझे यकीन नहीं है कि locationsउस विधि की पूरी सूची में कैसे पास किया जाए ।

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

.getMap(locations.toArray())

लेकिन getMap स्वीकार नहीं करता है क्योंकि यह वस्तुओं को स्वीकार नहीं करता है []।

अब अगर मैं उपयोग करता हूं

.getMap(locations.get(0));

यह पूरी तरह से काम करेगा ... लेकिन मुझे किसी भी तरह से सभी स्थानों में पास करने की आवश्यकता है ... मैं निश्चित रूप से इसे जोड़कर रख सकता हूं, locations.get(1), locations.get(2)लेकिन सरणी का आकार बदलता रहता है। मैं सिर्फ एक की पूरी अवधारणा का उपयोग नहीं कर रहा हूँArrayList

इस बारे में जाने का सबसे आसान तरीका क्या होगा? मुझे लगता है कि मैं अभी सीधे नहीं सोच रहा हूँ।


जवाबों:


340

स्रोत लेख: एक सूची को एक तर्क विधि के रूप में पारित करना


toArray(T[] arr)विधि का प्रयोग करें ।

.getMap(locations.toArray(new WorldLocation[locations.size()]))

( toArray(new WorldLocation[0])यह भी काम करता है, लेकिन आप बिना किसी कारण के शून्य लंबाई सरणी आवंटित करेंगे।)


यहाँ एक पूर्ण उदाहरण है:

public static void method(String... strs) {
    for (String s : strs)
        System.out.println(s);
}

...
    List<String> strs = new ArrayList<String>();
    strs.add("hello");
    strs.add("wordld");

    method(strs.toArray(new String[strs.size()]));
    //     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...

1
मेमोरी और स्पीड के मामले में यह ऑपरेशन कितना महंगा होगा?
माइंडरीडर

यह चेतावनी के बिना काम नहीं करेगा अगर इसमें और टेम्पलेट शामिल हों। ईजी someMethod(someList.toArray(new ArrayList<Something>[someList.size()]))आपको एक चेतावनी देगा जो कि फ़ंक्शन बहुत अधिक कष्टप्रद है यदि फ़ंक्शन कुछ पंक्तियों से अधिक लंबा है (क्योंकि आप या तो इसे पूरे फ़ंक्शन के लिए दबा सकते हैं या आपको एक अतिरिक्त चरण में सरणी बनाना होगा और आपको चर पर चेतावनी को दबा देना होगा इसे स्टोर करें।
Qw3ry

23
जाहिरा तौर पर सबसे तेज़ दृष्टिकोण सरणी के आकार के बजाय शून्य का आकार दे रहा है। संक्षेप में, यह इसलिए है क्योंकि संकलन-समय स्थिर एक अनुकूलित विधि के उपयोग को सक्षम करता है। shipilev.net/blog/2016/arrays-wisdom-ancients
geg

2
@JoshM। जावा को बहुत सी चीजों की आवश्यकता होती है। ;) मैं भी (एक सी # पृष्ठभूमि से आ रहा है) इंडेक्स ऑपरेटरों को याद करता हूं। जावा में हैशमैप्स के साथ काम करने के बजाय शब्दकोशों के साथ C # में बहुत अधिक सुचारू है।
प्रति लुंडबर्ग

@PerLundberg - पूरी तरह से सहमत हैं। इसके अलावा मुख्य रूप से C # डेवलपर वर्तमान में w / Java8 काम कर रहा है। शायद 10/11 बेहतर होगा। :
जोश एम।

42

जावा 8 में:

List<WorldLocation> locations = new ArrayList<>();

.getMap(locations.stream().toArray(WorldLocation[]::new));

2
यह जावा वूडू है, लेकिन बेहतर जावा (8) वूडू .. धन्यवाद!
ग्रानैडकोडर

locations.toArray(WorldLocations[]::new)यह भी जावा 11 (बिना .stream())
एरन मेदान

12

अमरूद के उपयोग से स्वीकृत उत्तर का एक छोटा संस्करण:

.getMap(Iterables.toArray(locations, WorldLocation.class));

इसे आगे बढ़ाने के लिए सांख्यिकीय रूप से आयात करके छोटा किया जा सकता है:

import static com.google.common.collect.toArray;
// ...

    .getMap(toArray(locations, WorldLocation.class));

1

तुम कर सकते हो:

getMap(locations.toArray(new WorldLocation[locations.size()]));

या

getMap(locations.toArray(new WorldLocation[0]));

या

getMap(new WorldLocation[locations.size()]);

@SuppressWarnings("unchecked") विचारधारा को हटाने के लिए आवश्यक है।


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