ArrayListをvarargsメソッドパラメータに渡す方法は?


236

基本的に私は場所のArrayListを持っています:

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

この下で私は次のメソッドを呼び出します:

.getMap();

getMap()メソッドのパラメーターは次のとおりです。

getMap(WorldLocation... locations)

私が抱えている問題はlocations、そのメソッドにWHOLEリストを渡す方法がわからないことです。

私はもう試した

.getMap(locations.toArray())

ただし、getMapはObject []を受け入れないため、これを受け入れません。

今私が使うなら

.getMap(locations.get(0));

それは完全に機能します...しかし、どういうわけかすべての場所を渡す必要があります...もちろん、追加locations.get(1), locations.get(2)などを続けることはできますが、配列のサイズは異なります。私は単に全体の概念に慣れていないArrayList

これに対処する最も簡単な方法は何でしょうか?今はまっすぐ考えていないような気がします。


回答:


340

ソース記事:リストを引数としてvarargメソッドに渡す


toArray(T[] arr)メソッドを使用します。

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

(これtoArray(new WorldLocation[0])も機能しますが、理由もなく長さ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
この操作は、メモリと速度の点でどれほどコストがかかりますか?
マインドリーダー2014

さらにテンプレートが含まれている場合、これは警告なしでは機能しません。たとえばsomeMethod(someList.toArray(new ArrayList<Something>[someList.size()]))、関数が数行より長い場合は非常に煩わしい警告が表示されます(関数全体でそれを抑制するか、追加の手順で配列を作成して変数の警告を抑制する必要があるため)保管
Qw3ry 2017年

23
どうやら最速のアプローチは、配列のサイズではなくゼロのサイズを与えることです。つまり、コンパイル時の定数により、最適化されたメソッドを使用できるためです。shipilev.net/blog/2016/arrays-wisdom-ancients
GEG

2
@JoshM。Javaには多くのものが必要です。;)私も(C#の背景から)インデックス演算子をミスしています。辞書の操作は、JavaのHashMapを操作するよりも、C#の方がはるかにスムーズです。
Lundbergによる

@PerLundberg-完全に同意します。また、現在Java8で作業している主なC#開発者です。たぶん10/11が良いでしょう。:-P
Josh M.

42

Java 8の場合:

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

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

2
これはjava voodooですが、より良いjava(8)voodooです。
granadaCoder

locations.toArray(WorldLocations[]::new)Java 11以降(なし.stream())でも機能するようです
Eran Medan

12

Guavaを使用して受け入れられた回答の短いバージョン:

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

toArrayを静的にインポートすることでさらに短縮できます。

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") ide警告を削除するために必要です。


1
2番目の解決策はより良いです!
gaurav
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.