2012-03-25 8 views
128

मूल रूप से मैं स्थानों में से एक ArrayList है विधि getMap() मेंएक varargs विधि पैरामीटर में एक ArrayList कैसे पास करें?</p> <pre><code>ArrayList<WorldLocation> locations = new ArrayList<WorldLocation>(); </code></pre> इस मैं निम्नलिखित विधि कॉल नीचे <p>:

.getMap(); 

मानकों हैं:

getMap(WorldLocation... locations) 

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

मैं

.getMap(locations.toArray()) 

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

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

.getMap(locations.get(0)); 

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

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

+0

से सावधान रहें (http : //stackoverflow.com/questions/33461138/java-automatically-converting-collections-to-arguments-arrays) – Vadzim

उत्तर

203

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()])); 
    //  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
... 

इस पोस्ट में है एक लेख here के रूप में पुनः लिखा गया है।

+1

स्मृति और गति के मामले में यह ऑपरेशन कितना महंगा होगा? – mindreader

+0

@ मिंड्रेडर मुझे लगता है कि इसका प्रदर्शन है: ओ (एन) –

+0

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

1

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

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

स्थिर आयात करके आगे छोटा किया जा सकता toArray [? जावा स्वचालित रूप से तर्क सरणियों को संग्रह परिवर्तित]

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

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