ArrayList'i varargs yöntem parametresine nasıl geçirebilirim?


236

Temelde konumların bir ArrayList var:

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

bunun altında aşağıdaki yöntemi çağırıyorum:

.getMap();

getMap () yöntemindeki parametreler şunlardır:

getMap(WorldLocation... locations)

Yaşadığım sorun, BÜTÜN listesine locationsbu yönteme nasıl geçeceğinden emin değilim .

denedim

.getMap(locations.toArray())

ancak getMap bunu kabul etmez çünkü Nesneleri kabul etmez [].

Şimdi kullanırsam

.getMap(locations.get(0));

mükemmel çalışacaktır ... ama bir şekilde TÜM yerlerden geçmek gerekir ... Tabii ki ekleme locations.get(1), locations.get(2)vb tutmak yapabilirsiniz ama dizinin boyutu değişir. Ben sadece birArrayList

Bununla ilgili en kolay yol ne olurdu? Şu an doğrudan düşünmüyor gibi hissediyorum.


Yanıtlar:


340

Kaynak makale: vararg yöntemine liste bağımsız değişken olarak iletme


toArray(T[] arr)Yöntemi kullanın .

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

( toArray(new WorldLocation[0])ayrıca çalışır, ancak sıfır uzunluklu bir diziyi hiçbir nedenle ayırmazsınız.)


İşte tam bir örnek:

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
Bu işlem bellek ve hız açısından ne kadar pahalı olurdu?
mindreader

İlgili başka şablonlar varsa, uyarı yapılmadan çalışmaz. Örneğin someMethod(someList.toArray(new ArrayList<Something>[someList.size()])), işlev birkaç satırdan daha uzunsa çok can sıkıcı bir uyarı verecektir (çünkü tüm işlev için onu bastırabilirsiniz veya ek bir adımda diziyi oluşturmanız ve değişkeninizdeki uyarıyı bastırmanız gerekir. saklayın.
Qw3ry

23
Görünüşe göre en hızlı yaklaşım dizinin boyutu yerine sıfır boyutu vermektir. Kısacası, derleme zamanı sabiti optimize edilmiş bir yöntemin kullanılmasını mümkün kılıyor. shipilev.net/blog/2016/arrays-wisdom-ancients
geg

2
@JoshM. Java'nın birçok şeye ihtiyacı vardır. ;) Ben de (bir C # arka plandan gelen) özledim dizin işleçleri. Sözlüklerle çalışmak C # dilinde Java'daki HashMaps ile çalışmaktan çok daha kolaydır.
Per Lundberg

@PerLundberg - Kesinlikle katılıyorum. Ayrıca şu anda Java8 ile çalışan öncelikle C # geliştiricisi. Belki 10/11 daha iyi olur. :-P
Josh

42

Java 8'de:

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

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

2
Bu java voodoo, ama daha iyi java (8) voodoo .. teşekkürler!
granadaCoder

locations.toArray(WorldLocations[]::new)ayrıca java 11'den beri çalışıyor gibi görünüyor (Olmadan .stream())
Eran Medan

12

Guava'yı kullanarak kabul edilen cevabın daha kısa bir versiyonu:

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

statik olarak Array'a içe aktarılarak daha da kısaltılabilir:

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

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

1

Yapabilirsin:

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

veya

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

veya

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

@SuppressWarnings("unchecked") IDE uyarısını kaldırmak için gereklidir.


1
2. çözüm daha iyidir!
gaurav
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.