配列から ArrayList を作成する
-
03-07-2019 - |
質問
次のように初期化された配列があります。
Element[] array = {new Element(1), new Element(2), new Element(3)};
この配列を ArrayList クラスのオブジェクトに変換したいと思います。
ArrayList<Element> arraylist = ???;
解決
new ArrayList<>(Arrays.asList(array))
他のヒント
指定:
Element[] array = new Element[] { new Element(1), new Element(2), new Element(3) };
最も簡単な答えは、次のとおりです。
List<Element> list = Arrays.asList(array);
これは正常に動作します。しかし、いくつかの警告:
- asListから返されるリストのサイズは固定サイズです。そのため、コードで返されたリストに要素を追加または削除できるようにするには、新しい
ArrayList
で要素をラップする必要があります。それ以外の場合は、UnsupportedOperationException
を取得します。 -
asList()
から返されるリストは、元の配列に基づいています。元の配列を変更すると、リストも変更されます。これは驚くかもしれません。
(古いスレッドですが、グアバや他のライブラリやその他の詳細に言及していないため、わずか2セントです)
可能であれば、グアバを使用
グアバの方法を指摘する価値はあります。グアバの方法は、これらの悲しみを大幅に簡素化します。
使用法
不変リストの場合
<= > クラスとその ImmutableList
および of()
ファクトリメソッド(要素をnullにすることはできません):
List<String> il = ImmutableList.of("string", "elements"); // from varargs
List<String> il = ImmutableList.copyOf(aStringArray); // from array
可変リストの場合
<= > クラスとその copyOf()
ファクトリメソッド:
List<String> l1 = Lists.newArrayList(anotherListOrCollection); // from collection
List<String> l2 = Lists.newArrayList(aStringArray); // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs
また、 Lists
。
なぜグアバなのか
主な魅力は、グアバファクトリメソッドにより、ほとんどの場合、型を推測できます。ただし、Java 7が新しいダイアモンド演算子を使用して到着したため、この引数の保持する水は少なくなります。
しかし、それが唯一の理由ではありません(そしてJava 7はまだどこにもありません):簡略記法も非常に便利であり、上記のようにメソッド初期化子はより表現力豊かなコードを書くことができます。現在のJavaコレクションで2回かかるグアバコールで1回行います。
できない場合...
不変リストの場合
JDKの newArrayList()
を使用します。クラスとその < => ファクトリメソッド、 Sets
:
List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));
Arrays
に対して返される型は、具体的なasList()
実装を使用したCollections.unmodifiableList()
ですが、そうではありません List
。これは内部型で、ArrayList
をエミュレートしますが、実際には渡された配列を直接参照し、<!> quot; write through <!> quot;にします。 (変更は配列に反映されます)。
単にjava.util.ArrayList
を拡張することでAbstractList
APIのメソッドの一部を変更することは禁止されています(したがって、要素の追加または削除はサポートされていません)が、set()
の呼び出しで要素をオーバーライドできます。したがって、このリストは真に不変ではなく、<=>の呼び出しは<=>でラップする必要があります。
変更可能なリストが必要な場合は、次の手順を参照してください。
可変リストの場合
上記と同じですが、実際の<=>でラップ:
List<String> l1 = new ArrayList<String>(Arrays.asList(array)); // Java 1.5 to 1.6
List<String> l1b = new ArrayList<>(Arrays.asList(array)); // Java 1.7+
List<String> l2 = new ArrayList<String>(Arrays.asList("a", "b")); // Java 1.5 to 1.6
List<String> l2b = new ArrayList<>(Arrays.asList("a", "b")); // Java 1.7+
教育目的の場合:古き良き手動の方法
// for Java 1.5+
static <T> List<T> arrayToList(final T[] array) {
final List<T> l = new ArrayList<T>(array.length);
for (final T s : array) {
l.add(s);
}
return (l);
}
// for Java < 1.5 (no generics, no compile-time type-safety, boo!)
static List arrayToList(final Object[] array) {
final List l = new ArrayList(array.length);
for (int i = 0; i < array.length; i++) {
l.add(array[i]);
}
return (l);
}
この質問はかなり古いので、誰もまだ最も単純な形式を提案していないことに驚きます:
List<Element> arraylist = Arrays.asList(new Element(1), new Element(2), new Element(3));
Java 5以降、Arrays.asList()
はvarargsパラメーターを受け取り、明示的に配列を作成する必要はありません。
new ArrayList<T>(Arrays.asList(myArray));
myArray
がT
と同じタイプであることを確認してください。たとえば、List<Integer>
の配列からint
を作成しようとすると、コンパイラエラーが発生します。
別の方法(ただし、本質的にnew ArrayList(Arrays.asList(array))
ソリューションのパフォーマンスと同等:
Collections.addAll(arraylist, array);
Java9
で Java9, 、使用できます List.of
静的ファクトリ メソッドを作成するには、 List
リテラル。次のようなものです。
List<Element> elements = List.of(new Element(1), new Element(2), new Element(3));
これにより、 不変 3 つの要素を含むリスト。ご希望の場合は、 可変 リストを作成したら、そのリストを ArrayList
コンストラクタ:
new ArrayList<>(List.of(// elements vararg))
JEP 269:コレクションのためのコンビニエンス ファクトリ メソッド
JEP 269 いくつかの便利なファクトリメソッドを提供します Java コレクション API。これらの不変の静的ファクトリ メソッドは、 List
, Set
, 、 そして Map
Java 9 以降のインターフェイス。
おそらくArrayListではなくListのみが必要です。その場合は、次のことができます。
List<Element> arraylist = Arrays.asList(array);
別の更新、ほぼ2014年の終わり、Java 8でも実行できます:
ArrayList<Element> arrayList = Stream.of(myArray).collect(Collectors.toCollection(ArrayList::new));
これが単なるList
List<Element> list = Stream.of(myArray).collect(Collectors.toList());
使用する場合:
new ArrayList<T>(Arrays.asList(myArray));
2つのリストを作成して 作成できます!大きなリストを2回入力するのは、容量を拡張する必要があるたびに別のObject[]
配列を作成するため、まったくしたくないことです。
幸い、JDKの実装は高速で、Arrays.asList(a[])
は非常によくできています。 Object []データが配列を直接指すArrays.ArrayListという名前のArrayListを作成します。
// in Arrays
@SafeVarargs
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
//still in Arrays, creating a private unseen class
private static class ArrayList<E>
private final E[] a;
ArrayList(E[] array) {
a = array; // you point to the previous array
}
....
}
危険な側面は、初期配列を変更すると、リストも変更されることです!本当によろしいですか?たぶんそう、そうでないかもしれない。
そうでない場合、最も理解できる方法はこれを行うことです:
ArrayList<Element> list = new ArrayList<Element>(myArray.length); // you know the initial capacity
for (Element element : myArray) {
list.add(element);
}
または@glglglが言ったように、別の独立したArrayListを作成できます:
<*> Collections
、Arrays
、またはGuavaを使用するのが大好きです。しかし、収まらない場合、または感じない場合は、代わりに別の行を書きます。
Java 9
では次を使用できます:
List<String> list = List.of("Hello", "World", "from", "Java");
List<Integer> list = List.of(1, 2, 3, 4, 5);
質問によると、Java 1.7を使用した答えは次のとおりです。
ArrayList<Element> arraylist = new ArrayList<Element>(Arrays.<Element>asList(array));
ただし、常にインターフェイスを使用することをお勧めします:
List<Element> arraylist = Arrays.<Element>asList(array);
// Guava
import com.google.common.collect.ListsLists
...
List<String> list = Lists.newArrayList(aStringArray);
さまざまな方法で変換できます
-
List<Element> list = Arrays.asList(array);
-
List<Element> list = new ArrayList();
Collections.addAll(list, array); -
Arraylist list = new Arraylist();
list.addAll(Arrays.asList(array));
詳細については、 httpを参照してください。 ://javarevisited.blogspot.in/2011/06/converting-array-to-arraylist-in-java.html
これがすべてそうなると言ったように
new ArrayList<>(Arrays.asList("1","2","3","4"));
および配列を作成する一般的な最新の方法は、 observableArrays
ですObservableList:リスナーが変更が発生したときに追跡できるようにするリスト。
Java SEの場合は試すことができます
FXCollections.observableArrayList(new Element(1), new Element(2), new Element(3));
Oracle Docs に準拠
observableArrayList() arraylistを利用した新しい空のオブザーバブルリストを作成します。 observableArrayList(E ...アイテム) 項目が追加された新しい監視可能配列リストを作成します。
Java 9を更新
Java 9でも少し簡単です:
List<String> list = List.of("element 1", "element 2", "element 3");
Java 8のストリームでも実行できます。
List<Element> elements = Arrays.stream(array).collect(Collectors.toList());
Java 8以降、より簡単な変換方法があります:
public static <T> List<T> fromArray(T[] array) {
return Arrays.stream(array).collect(toList());
}
-
Arrays.asList()
メソッドの定義が表示される場合、次のようなものが得られます:public static <T> List<T> asList(T... a) //varargs are of T type.
したがって、
arraylist
を次のように初期化できます:List<Element> arraylist = Arrays.asList(new Element(1),new Element(2),new Element(3));
注:各
new Element(int args)
は個別のオブジェクトとして扱われ、var-args
として渡すことができます。 -
この質問には別の答えがあるかもしれません。
java.util.Collections.addAll()
メソッドの宣言が表示された場合、次のようなものが得られます:public static <T> boolean addAll(Collection<? super T> c, T... a);
つまり、このコードはそうするのにも便利です
Collections.addAll(arraylist, array);
もう1つの簡単な方法は、for-eachループを使用して、配列のすべての要素を新しいArrayListに追加することです。
ArrayList<Element> list = new ArrayList<>();
for(Element e : array)
list.add(e);
配列がプリミティブ型の場合、指定された回答は機能しません。ただし、Java 8以降では次を使用できます。
int[] array = new int[5];
Arrays.stream(array).boxed().collect(Collectors.toList());
配列をArrayList
に簡単に変換できます。
あるリストから別のリストにコンテンツをコピーするために、CollectionインターフェイスのaddAll()
メソッドを使用します。
Arraylist arr = new Arraylist();
arr.addAll(Arrays.asList(asset));
この質問に対する多くの完全に書かれた答えがありますが、入力を追加します。
Element[] array = { new Element(1), new Element(2), new Element(3) };
新しいArrayListは次の方法で作成できます
ArrayList<Element> arraylist_1 = new ArrayList<>(Arrays.asList(array));
ArrayList<Element> arraylist_2 = new ArrayList<>(
Arrays.asList(new Element[] { new Element(1), new Element(2), new Element(3) }));
// Add through a collection
ArrayList<Element> arraylist_3 = new ArrayList<>();
Collections.addAll(arraylist_3, array);
そしてArrayListのすべての操作を非常によくサポートしています
arraylist_1.add(new Element(4)); // or remove(): Success
arraylist_2.add(new Element(4)); // or remove(): Success
arraylist_3.add(new Element(4)); // or remove(): Success
ただし、次の操作は、実際のArrayListではなく、ArrayListのリストビューのみを返します。
// Returns a List view of array and not actual ArrayList
List<Element> listView_1 = (List<Element>) Arrays.asList(array);
List<Element> listView_2 = Arrays.asList(array);
List<Element> listView_3 = Arrays.asList(new Element(1), new Element(2), new Element(3));
したがって、ArrayList操作を実行しようとするとエラーが発生します
listView_1.add(new Element(4)); // Error
listView_2.add(new Element(4)); // Error
listView_3.add(new Element(4)); // Error
配列のリスト表現の詳細リンク。
これを行う最も簡単な方法は、次のコードを追加することです。試し、テストしました。
String[] Array1={"one","two","three"};
ArrayList<String> s1= new ArrayList<String>(Arrays.asList(Array1));
別のJava8ソリューション(大規模なセットの中で答えを逃した可能性があります。もしそうなら、私の謝罪)。これにより、ArrayList(リストではなく)が作成されます。 p>
package package org.something.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Junk {
static <T> ArrayList<T> arrToArrayList(T[] arr){
return Arrays.asList(arr)
.stream()
.collect(Collectors.toCollection(ArrayList::new));
}
public static void main(String[] args) {
String[] sArr = new String[]{"Hello", "cruel", "world"};
List<String> ret = arrToArrayList(sArr);
// Verify one can remove an item and print list to verify so
ret.remove(1);
ret.stream()
.forEach(System.out::println);
}
}
出力は...
こんにちは
世界
次のようにJava 8で実行できます
ArrayList<Element> list = (ArrayList<Element>)Arrays.stream(array).collect(Collectors.toList());
すでにあなたの問題に対して十分な答えを提供してくれています。 すべての提案から、要件に合うものを決定する必要があります。知っておく必要があるコレクションには2つのタイプがあります。 1つは変更されていないコレクションで、もう1つは後でオブジェクトを変更できるコレクションです。
そのため、ここでは2つのユースケースの簡単な例を示します。
-
不変コレクションの作成::作成後にコレクションオブジェクトを変更したくない場合
List<Element> elementList = Arrays.asList(array)
-
変更可能なコレクションの作成::作成後に作成したコレクションオブジェクトを変更する場合。
List<Element> elementList = new ArrayList<Element>(Arrays.asList(array));
次のコードを使用して、要素配列をArrayListに変換します。
Element[] array = {new Element(1), new Element(2), new Element(3)};
ArrayList<Element>elementArray=new ArrayList();
for(int i=0;i<array.length;i++) {
elementArray.add(array[i]);
}
Cactoos (私は開発者の1人です)を使用してArrayList
を作成できます。
List<String> names = new StickyList<>(
"Scott Fitzgerald", "Fyodor Dostoyevsky"
);
オブジェクトが実際にクラス<=>になるという保証はありません。その保証が必要な場合は、これを行います:
ArrayList<String> list = new ArrayList<>(
new StickyList<>(
"Scott Fitzgerald", "Fyodor Dostoyevsky"
)
);
以下のコードを使用
Element[] array = {new Element(1), new Element(2), new Element(3)};
ArrayList<Element> list = (ArrayList) Arrays.asList(array);
これはそのための明確な方法です
ArrayList<Element> arraylist = new ArrayList<>(Arrays.asList(array))