Javaで配列をリストに変換する方法
私はArrays.asList()
を使いましたが、振る舞い(そして署名)はどういうわけかJava SE 1.4.2 (現在アーカイブにあるドキュメント)から 8 に変わり、ウェブ上で見つけたほとんどのスニペットは1.4.2の振る舞いを使います。
例えば:
int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
多くの場合、検出は簡単なはずですが、気付かれずに滑ることがあります。
Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);
あなたの例では、それはあなたがプリミティブ型のリストを持つことができないからです。言い換えれば、List<int>
は不可能です。
ただし、Integer
プリミティブをラップする int
クラスを使用してList<Integer>
を作成することはできます。 Arrays.asList
ユーティリティメソッドを使用して、配列を List
に変換します。
Integer[] spam = new Integer[] { 1, 2, 3 };
List<Integer> list = Arrays.asList(spam);
これを参照してください IdeOne.comでライブで実行されているコード 。
Java 8では、ストリームを使用できます。
int[] spam = new int[] { 1, 2, 3 };
Arrays.stream(spam)
.boxed()
.collect(Collectors.toList());
変換方法について言えば、それはなぜあなたがあなたの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を指定する必要があることに注意してください。
問題は、可変引数がJava5で導入され、残念ながらArrays.asList()
も可変引数バージョンでオーバーロードされたことです。そのため、Arrays.asList(spam)
は、Java5コンパイラではint配列の可変引数として理解されています。
この問題はEffective Java 2nd Ed。、Chapter 7、Item 42でさらに詳しく説明されています。
それは少し遅く思えますが、ここに私の2セントがあります。 int
はプリミティブ型なのでList<int>
を持つことはできません。したがってList<Integer>
しか持てません。
int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList());
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
なら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)
を呼ぶことができるという意味で修正することができますが、このリストは構造的に修正することはできません、すなわちリストに要素を追加または削除することはできません。これをチェックすることもできます question 。
不変リストが必要な場合は、次のようにラップできます。
List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));
もう1つ注意すべき点は、メソッドCollections.unmodifiableList
は指定されたリストの変更不可能なビューを返すということです。変更不可能なビューコレクションは、変更不可能なコレクションであり、バッキングコレクションに対するビューでもあります。バッキングコレクションへの変更はまだ可能である可能性があることに注意してください。それらが発生した場合、それらは変更不可能なビューを通して表示されます。
Java 10では本当に不変のリストを作成できます。
List.copyOf(Arrays.asList(integers))
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
また、こちらの answer もチェックしてください。
私は最近配列をリストに変換しなければなりませんでした。後でプログラムがデータを削除しようとしているリストをフィルタリングしました。 Arrays.asList(配列)関数を使用すると、固定サイズのコレクションが作成されます。追加も削除もできません。このエントリは私ができる以上に問題を説明しています。 リストから要素を削除しようとするとUnsupportedOperationExceptionが発生するのはなぜですか? 。
結局、私は「手動」変換をしなければなりませんでした:
List<ListItem> items = new ArrayList<ListItem>();
for (ListItem item: itemsArray) {
items.add(item);
}
List.addAll(items)操作を使用して、配列からリストへの変換を追加できたとします。
さらにもっと短く:
List<Integer> list = Arrays.asList(1, 2, 3, 4);
これは、配列を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!
for
ループを使用して、配列のすべての要素をList
の実装に追加できます。 ArrayList
:
List<Integer> list = new ArrayList<>();
for (int i : new int[]{1, 2, 3}) {
list.add(i);
}
配列をストリームに変換してから、さまざまなコレクターを使用してストリームを収集することができます。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));
また見なさい:
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>
に変換できません」を回避するのに役立ちます。
Apache commons-langを使用する場合の別の回避策:
int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(ArrayUtils.toObject(spam));
ArrayUtils.toObject はint[]
をInteger[]
に変換します。
グアバ語を使う:
Integer[] array = { 1, 2, 3};
List<Integer> list = Lists.newArrayList(sourceArray);
Apache Commonsコレクションの使い方
Integer[] array = { 1, 2, 3};
List<Integer> list = new ArrayList<>(6);
CollectionUtils.addAll(list, array);
ワンライナー:
List<Integer> list = Arrays.asList(new Integer[] {1, 2, 3, 4});
配列にキャストする必要があります
Arrays.asList((Object[]) array)
これが助けになるならば:私は同じ問題を抱えていて、単純に配列を取りそして同じ内容で同じタイプの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バージョンを試しているかによって異なります。
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);
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/