Javaで配列をリストに変換する


1028

Javaで配列をリストに変換するにはどうすればよいですか?

私は使用しましたArrays.asList()が、動作(および署名)がJava SE 1.4.2(ドキュメントは現在アーカイブにあります)から8に変更され、Webで見つけたほとんどのスニペットは1.4.2の動作を使用しています。

例えば:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
  • on 1.4.2は、要素1、2、3を含むリストを返します
  • 1.5.0以降では、spam配列を含むリストを返します

多くの場合、検出は簡単ですが、気付かれない場合があります。

Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);

20
私はあなたの例が壊れていると思います:Arrays.asList(new int[] { 1, 2, 3 }); ので、間違いなく、Javaの1.4.2でコンパイルしていなかったint[]ですではありませんObject[]
Joachim Sauer、

1
ああ、あなたは正しいかもしれません。投稿する前にサンプルをテストするJava 1.4.2コンパイラがありませんでした。今、あなたのコメントとジョーの答えの後、すべてがはるかに理にかなっています。
Alexandru

1
オートボクシングは、プリミティブからラッパーの整数クラスへの変換をカバーしていると思いました。最初に自分でキャストを作成してから、上記のコードが機能するArrays.asListはずです。
ホースボイス

2
Java 8のStream.boxed()がオートボクシングを処理し、これに使用できます。以下の私の答えを参照してください。
イブラヒムアリエフ

回答:


1431

あなたの例では、それはプリミティブ型のリストを持つことができないからです。つまり、List<int>不可能です。

ただし、プリミティブをラップするクラスをList<Integer>使用することができます。ユーティリティメソッドを使用して配列をに変換します。IntegerintListArrays.asList

Integer[] spam = new Integer[] { 1, 2, 3 };
List<Integer> list = Arrays.asList(spam);

IdeOne.comでこのコードがライブで実行されることを確認してください


112
またはさらに簡単です:Arrays.asList(1、2、3);
香港

45
作成しないようにするにはどうすればよいList<Integer[]>ですか?
Thomas Ahle 2014

25
Java 5以降では失敗します。
djechlin 14

6
@ThomasAhle List <Integer []>を作成せず、List <Integer>オブジェクトを作成します。タイプセーフにしたい場合は、次のように記述します。Arrays。<Integer> asList(spam);
user1712376 2014年

6
@ThomasAhleいい質問ですね。それはJavaコンパイラの単なるルールだと思います。たとえば、次のコードはList <Integer []>を返します Integer[] integerArray1 = { 1 }; Integer[] integerArray2 = { 2 }; List<Integer[]> integerArrays = Arrays.asList(integerArray1, integerArray2);
Simon

167

Java 8では、ストリームを使用できます。

int[] spam = new int[] { 1, 2, 3 };
Arrays.stream(spam)
      .boxed()
      .collect(Collectors.toList());

これは便利ですが、では機能しませんboolean[]。それは、を作成するのと同じくらい簡単だからだと思いBoolean[]ます。それはおそらくより良い解決策です。とにかく、それは興味深い癖です。
GlenPeterson

138

変換方法について言えば、それはなぜあなたがあなたを必要とするかによりますList。データを読み取るためだけに必要な場合。はい、どうぞ。

Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);

しかし、次のような場合:

list.add(1);

あなたが得るjava.lang.UnsupportedOperationException。したがって、場合によってはこれも必要になります。

Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));

最初のアプローチは実際には配列を変換しませんが、のように「表現」しListます。しかし、配列は固定数の要素のようなすべてのプロパティを備えた内部にあります。を構築するときにタイプを指定する必要があることに注意してくださいArrayList


1
「不変性」が私を一瞬混乱させました。明らかに配列の値を変更できます。ただし、サイズを変更することはできません。
Tim Pohlmann、2017年

125

問題は、可変引数がJava5で導入され、残念ながら可変引数Arrays.asList()バージョンでオーバーロードされてしまうことです。したがってArrays.asList(spam)、Java5コンパイラでは、int配列のvarargパラメータとして理解されます。

この問題は、Effective Java 2nd Ed。、Chapter 7、Item 42で詳しく説明されています。


4
何が起こったのかは理解できますが、それが文書化されていない理由はわかりません。ホイールを再実装せずに代替ソリューションを探しています。
Alexandru

2
@UsmanIsmail Java 8以降、この変換にストリームを使用できます。以下の私の答えを参照してください。
イブラヒムアリエフ

109

少し遅いようですが、ここは私の2セントです。我々は持つことができないList<int>としてint、我々が唯一持っていることができるようにプリミティブ型ですList<Integer>

Java 8(int配列)

int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList()); 

Java 8以下(整数配列)

Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 =  Arrays.asList(integers); // returns a fixed-size list backed by the specified array.
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only

リストではなくArrayListが必要ですか?

Listたとえば、特定の実装が必要な場合は、次のArrayListように使用できますtoCollection

ArrayList<Integer> list24 = Arrays.stream(integers)
                          .collect(Collectors.toCollection(ArrayList::new));

list21構造的に変更できないのはなぜですか?

使用Arrays.asListする場合、返されるリストのサイズは固定されているため、返されるリストのサイズは固定されていますjava.util.ArrayListが、内部で定義されているプラ​​イベート静的クラスjava.util.Arraysです。したがって、返されたリストに要素を追加または削除するUnsupportedOperationExceptionと、がスローされます。したがってlist22、リストを変更する場合は、このままでかまいません。Java8を使用している場合は、も使用できlist23ます。

明確にlist21することは、呼び出すことができるという意味で変更できますlist21.set(index,element)が、このリストは構造的に変更されない可能性があります。つまり、リストに要素を追加または削除できません。この質問も確認できます。


不変のリストが必要な場合は、次のようにラップできます。

List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));

注意すべきもう1つの点は、メソッドCollections.unmodifiableListが指定されたリストの変更不可能なビューを返すことです。変更不可能なビューコレクションは、変更不可能なコレクションであり、バッキングコレクションのビューでもあります。バッキングコレクションへの変更はまだ可能であることに注意してください。変更が発生した場合は、変更不可能なビューから確認できます。

Java 9と10では、真に不変のリストを持つことができます。

真に不変のリスト

Java 9:

String[] objects = {"Apple", "Ball", "Cat"};
List<String> objectList = List.of(objects);

2つの方法でJava 10(真の不変リスト):

  1. List.copyOf(Arrays.asList(integers))
  2. Arrays.stream(integers).collect(Collectors.toUnmodifiableList());

詳細については、この私の答えを確認してください。


@BasilBourque追加/削除によってリストの構造を変更することはできませんが、要素を変更することはできます。
akhil_mittal

確かに、私はいくつかのコードを試してみました呼び出すことを確認したList::add&することList::removeによって返されたリストで失敗しますArrays.asList。そのメソッドのJavaDocは不十分であり、この点については不明です。3回目の読みで、「固定サイズ」という語句は、要素を追加または削除できないことを意味するものであったと思います。
バジルブルク


11

最近、配列をリストに変換する必要がありました。プログラムの後で、データを削除しようとしてリストをフィルタリングしました。Arrays.asList(array)関数を使用すると、固定サイズのコレクションが作成されます。追加も削除もできません。このエントリは、問題を私よりもうまく説明しています。リストから要素を削除しようとすると、なぜUnsupportedOperationExceptionが発生するのですか?

最後に、「手動」変換を行わなければなりませんでした。

    List<ListItem> items = new ArrayList<ListItem>();
    for (ListItem item: itemsArray) {
        items.add(item);
    }

List.addAll(items)操作を使用して、配列からリストへの変換を追加できたと思います。


11
new ArrayList<ListItem>(Arrays.asList(itemsArray))同じになり
Marco13

1
@BradyZhu:確かに上記の答えは固定サイズの配列に関する私の問題を解決しませんが、基本的にここではRTFMと言っていますが、これは常に悪い形式です。答えの何が悪いのかを説明してください。
Steve Gelman、2015

2
検査ツールはここに警告を表示する場合があり、理由を指定しました。要素を手動でコピーする必要はありませんCollections.addAll(items, itemsArray)。代わりに使用してください。
Darek Kay

この例外をヒットしてください。Marco13の答えが正しい答えであると思います。すべての "asList"例外を修正するには、通年のコードを実行する必要があるかもしれません。

7

配列の使用

これは、配列をに変換する最も簡単な方法Listです。ただし、新しい要素を追加したり、既存の要素をリストから削除しようとすると、UnsupportedOperationExceptionがスローされます。

Integer[] existingArray = {1, 2, 3};
List<Integer> list1 = Arrays.asList(existingArray);
List<Integer> list2 = Arrays.asList(1, 2, 3);

// WARNING:
list2.add(1);     // Unsupported operation!
list2.remove(1);  // Unsupported operation!

ArrayListまたはその他のリスト実装の使用

forループを使用して、配列のすべての要素をList実装に追加できます。例ArrayList

List<Integer> list = new ArrayList<>();
for (int i : new int[]{1, 2, 3}) {
  list.add(i);
}

Java 8でのストリームAPIの使用

配列をストリームに変換してから、さまざまなコレクターを使用してストリームを収集できます。Java8のデフォルトのコレクターArrayListは画面の背後で使用しますが、優先実装を強制することもできます。

List<Integer> list1, list2, list3;
list1 = Stream.of(1, 2, 3).collect(Collectors.toList());
list2 = Stream.of(1, 2, 3).collect(Collectors.toCollection(ArrayList::new));
list3 = Stream.of(1, 2, 3).collect(Collectors.toCollection(LinkedList::new));

以下も参照してください。



5

あなたは配列にキャストする必要があります

Arrays.asList((Object[]) array)

3
java:互換性のないタイプ:int []はjava.lang.Object []に変換できません
dVaffection 14年

@dVaffection次に、int []にキャストします。重要な部分は、配列にキャストすることです。
Nebril、2014


5

Java 9では、新しいコンビニエンスファクトリメソッドを介して不変のリストを使用する、よりエレガントなソリューションがありますList.of

List<String> immutableList = List.of("one","two","three");

ここから恥知らずにコピー)


FYI、この背後にある技術的な詳細のいくつかを学ぶために、参照のコレクションの利便工場方法:JEP 269スチュアート・マークスによって話、主要著者。
バジルブルク2018

5

Java 8以降をターゲットにしている場合は、これを試すことができます。

int[] numbers = new int[] {1, 2, 3, 4};
List<Integer> integers = Arrays.stream(numbers)
                        .boxed().collect(Collectors.<Integer>toList());

注意:

注意してCollectors.<Integer>toList()、この一般的な方法は、エラーを回避するのに役立ちます「型の不一致を:から変換できませんList<Object>List<Integer>」。


4
  1. Guavaの使用:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = Lists.newArrayList(sourceArray);
  2. Apache Commons Collectionの使用:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = new ArrayList<>(6);
    CollectionUtils.addAll(list, array);

3

これが役立つ場合:私は同じ問題を抱えていて、配列を取り、同じタイプのArrayListを同じ内容で返す汎用関数を単に作成しました:

public static <T> ArrayList<T> ArrayToArrayList(T[] array) {
    ArrayList<T> list = new ArrayList<T>();
    for(T elmt : array) list.add(elmt);
    return list;
}

それが役に立たない場合はどうなりますか?その後、あなたは何をしましたか?... JK :)
SᴀᴍOnᴇᴌᴀ

2

与えられた配列:

    int[] givenArray = {2,2,3,3,4,5};

整数配列を整数リストに変換する

1つの方法:boxed()-> IntStreamを返します

    List<Integer> givenIntArray1 = Arrays.stream(givenArray)
                                  .boxed()
                                  .collect(Collectors.toList());

2番目の方法:ストリームの各要素をIntegerにマップして収集します

注: mapToObjを使用すると、iを(char)iにケーシングすることで、各int要素を文字列ストリーム、charストリームなどに変換できます

    List<Integer> givenIntArray2 = Arrays.stream(givenArray)
                                         .mapToObj(i->i)
                                         .collect(Collectors.toList());

ある配列タイプを別のタイプに変換する例:

List<Character> givenIntArray2 = Arrays.stream(givenArray)
                                             .mapToObj(i->(char)i)
                                             .collect(Collectors.toList());

1

だからそれはあなたがしようとしているJavaのバージョンに依存します-

Java 7

 Arrays.asList(1, 2, 3);

または

       final String arr[] = new String[] { "G", "E", "E", "K" };
       final List<String> initialList = new ArrayList<String>() {{
           add("C");
           add("O");
           add("D");
           add("I");
           add("N");
       }};

       // Elements of the array are appended at the end
       Collections.addAll(initialList, arr);

または

Integer[] arr = new Integer[] { 1, 2, 3 };
Arrays.asList(arr);

Java 8

int[] num = new int[] {1, 2, 3};
List<Integer> list = Arrays.stream(num)
                        .boxed().collect(Collectors.<Integer>toList())

リファレンス - http://www.codingeek.com/java/how-to-convert-array-to-list-in-java/


1

これは私が使用しているものですが、100%明確ではないため、この回答を改善していただけますか。正常に動作しますが、intelliJは新しいWeatherStation [0]を追加しました。なぜ0なのか?

    public WeatherStation[] removeElementAtIndex(WeatherStation[] array, int index)
    {
        List<WeatherStation> list = new ArrayList<WeatherStation>(Arrays.asList(array));
        list.remove(index);
        return list.toArray(new WeatherStation[0]);
    }


なぜあなたの質問改善する必要があるのですか?答えを知っているか、知らないかのどちらかです。もちろん、他の人を本当に助ける答えを提供する必要があります。それ以上に混乱する人ではありません。
HimBromBeere

-2

2行のコードを使用して配列をリストに変換します。整数値で使用する場合は、プリミティブデータタイプにオートボクシングタイプを使用する必要があります。

  Integer [] arr={1,2};
  Arrays.asList(arr);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.