2012-03-25 17 views
128

zasadzie muszę ArrayList lokalizacji:Jak przekazać ArrayList do parametru metody varargs?

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

poniżej tej zgłoszę następującą metodę:

.getMap(); 

parametrów w sposobie GetMap() to:

getMap(WorldLocation... locations) 

Problem, który mam, to nie jestem pewien, jak przejść na całą listę locations do tej metody.

Próbowałem

.getMap(locations.toArray()) 

ale GetMap nie akceptuje, bo nie akceptuje obiektów [].

Teraz, jeśli mogę użyć

.getMap(locations.get(0)); 

to będzie działać idealnie ... ale muszę jakoś przekazać we wszystkich lokalizacjach ... Mogę oczywiście zrobić dodajemy locations.get(1), locations.get(2) itp ale rozmiar tablica zmienia się. Po prostu nie używam całej koncepcji: Jaki byłby najłatwiejszy sposób, aby to osiągnąć? Czuję, że po prostu nie myślę teraz prosto.

+0

Strzeż (http : //stackoverflow.com/questions/33461138/java-automatycznie-przeniesienie-kolekcji-do-argumenty-tagi) – Vadzim

Odpowiedz

203

Użyj metody toArray(T[] arr).

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

(toArray(new WorldLocation[0]) również działa, ale można przydzielić tablicę o zerowej długości bez powodu.)


Oto pełna przykład:

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

Ten wpis został przepisany jako artykuł here.

+1

Jaka jest kosztowna operacja pod względem pamięci i szybkości? – mindreader

+0

@mindreader Myślę, że jego wydajność jest: O (n) –

+0

To nie zadziała bez ostrzeżenia, jeśli są zaangażowane inne szablony. Na przykład. 'someMethod (someList.toArray (nowa ArrayList [someList.size()]))' da ci ostrzeżenie, które jest bardzo denerwujące, jeśli funkcja jest dłuższa niż kilka linii (ponieważ możesz albo wyłączyć ją dla całej funkcji lub musisz utworzyć tablicę w dodatkowym kroku i wyłączyć ostrzeżenie na zmiennej, którą przechowujesz. – Qw3ry

1

Krótsza wersja przyjętego odpowiedź używając Guava:

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

można skrócić dalej statycznie importowania toArray [? Java automatycznie przekształcania zbiorów argumentów tablic]

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

    .getMap(toArray(locations, WorldLocation.class)); 
Powiązane problemy