web-dev-qa-db-ja.com

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

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

私はArrays.asList()を使いましたが、振る舞い(そして署名)はどういうわけかJava SE 1.4.2 (現在アーカイブにあるドキュメント)から 8 に変わり、ウェブ上で見つけたほとんどのスニペットは1.4.2の振る舞いを使います。

例えば:

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

多くの場合、検出は簡単なはずですが、気付かれずに滑ることがあります。

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

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

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

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

これを参照してください IdeOne.comでライブで実行されているコード

1257
Joe Daley

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

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

変換方法について言えば、それはなぜあなたがあなたの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を構築するときにはtypeを指定する必要があることに注意してください。

121

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

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

118
Péter Török

それは少し遅く思えますが、ここに私の2セントがあります。 intはプリミティブ型なのでList<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

Listではなく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を使うこともできます。

明らかにlist21list21.set(index,element)を呼ぶことができるという意味で修正することができますが、このリストは構造的に修正することはできません、すなわちリストに要素を追加または削除することはできません。これをチェックすることもできます question


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

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

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

Java 10では本当に不変のリストを作成できます。

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

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

また、こちらの answer もチェックしてください。

77
i_am_zero

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

結局、私は「手動」変換をしなければなりませんでした:

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

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

8
Steve Gelman

さらにもっと短く:

List<Integer> list = Arrays.asList(1, 2, 3, 4);
7
Vitaliy Sokolov

配列を使う

これは、配列を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でStream 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
Mincong Huang

Java 9では、新しいコンビニエンスファクトリメソッド List.of を介して不変リストを使用する、さらに洗練された方法があります。

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

(恥知らずに からコピーされた

3

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>に変換できません」を回避するのに役立ちます。

3
nybon

Apache commons-langを使用する場合の別の回避策:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(ArrayUtils.toObject(spam));

ArrayUtils.toObjectint[]Integer[]に変換します。

3
alaster
  1. グアバ語を使う:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = Lists.newArrayList(sourceArray);
    
  2. Apache Commonsコレクションの使い方

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

ワンライナー:

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

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

Arrays.asList((Object[]) array)
2

これが助けになるならば:私は同じ問題を抱えていて、単純に配列を取りそして同じ内容で同じタイプのArrayListを返す一般的な関数を書いた:

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

ですから、どのJavaバージョンを試しているかによって異なります。

Java 7

 Arrays.asList(1, 2, 3);

OR

       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);

OR

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/

0
Hitesh Garg