java - 違い - 配列からArrayListを作成する
java 配列 arraylist 違い (20)
もう1つのJava8ソリューション(私は大きなセットの中で答えを見逃しているかもしれません。もしそうなら、私の謝罪)。 これは、リストとは対照的にArrayListを作成します。つまり、要素を削除できます。
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);
}
}
出力は...
こんにちは
世界
私は次のように初期化された配列を持っています:
Element[] array = {new Element(1), new Element(2), new Element(3)};
この配列をArrayListクラスのオブジェクトに変換したいと思います。
ArrayList<Element> arraylist = ???;
Java 9
Java 9では、 List
リテラルを作成するために、静的ファクトリメソッドのList.of
を使用できます。 次のようなもの:
List<Element> elements = List.of(new Element(1), new Element(2), new Element(3));
これは、3つの要素を含むimmutableリストを返します。 変更可能なリストが必要な場合は、そのリストをArrayList
コンストラクタに渡します。
new ArrayList<>(List.of(// elements vararg))
JEP 269:コレクションの便利なファクトリメソッド
JEP 269では、 Java Collections APIの便利なファクトリメソッドを提供しています。 これらの不変の静的ファクトリメソッドは、Java 9以降のList
、 Set
、およびMap
インタフェースに組み込まれています。
Arrays.asList(arrayObj);の助けを借りて簡単に行うことができます。
Element[] array = {new Element(1), new Element(2), new Element(3)};
ArrayList<Element> arraylist =Arrays.asList(array);
Java 8以降では、より簡単に変換する方法があります。
public static <T> List<T> fromArray(T[] array) {
return Arrays.stream(array).collect(toList());
}
(古いスレッドですが、Guavaや他のライブラリやその他の詳細については何も言及していません)
あなたができるなら、グアバを使う
グアバの方法を指摘する価値はありますが、それはこれらの偽善を大幅に単純化します。
使用法
不変リストの場合
ImmutableList
クラスとof()
およびcopyOf()
ファクトリメソッドを使用します(要素はnullにはできません) 。
List<String> il = ImmutableList.of("string", "elements"); // from varargs
List<String> il = ImmutableList.copyOf(aStringArray); // from array
変更可能なリストの場合
Lists
クラスとnewArrayList()
ファクトリメソッドを使用します。
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
他のクラスの他のデータ構造(例えば、 Sets
)についても同様の方法に注意してください。
なぜグアバ?
Guavaのファクトリメソッドを使用することで、ほとんどの場合、型の推論が可能になるため、型の安全性のためにジェネリックスによる混乱を減らすことが主な魅力です。 しかし、この議論は、Java 7が新しいダイヤモンド演算子で到着して以来、水が少なくなっています。
しかし、それが唯一の理由ではありません(Java 7はまだどこにもありません)。省略形の構文も非常に便利で、上記のメソッドイニシャライザは、より表現力豊かなコードを書くことを可能にします。 1つのGuavaコールで、現在のJava Collectionsで2を引き受けます。
あなたができないなら...
不変リストの場合
Collections.unmodifiableList()
でラップされたJDKのArrays
クラスとそのasList()
ファクトリメソッドを使用しCollections.unmodifiableList()
。
List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));
asList()
返される型は、具体的なArrayList
実装を使用するList
ArrayList
が、 java.util.ArrayList
ではありません 。 それはArrayList
をエミュレートするが、渡された配列を実際に直接参照し、それを "write through"(配列に変更が反映される)にする内部型ArrayList
。
AbstractList
拡張することで、 List
APIのメソッドの一部を変更することは禁じられています(要素の追加または削除はサポートされていません)。 したがって、このリストは本当に不変ではなく、 asList()
への呼び出しはCollections.unmodifiableList()
ラップする必要があります。
変更可能なリストが必要な場合は、次の手順を参照してください。
変更可能なリストの場合
上記と同じですが、実際のjava.util.ArrayList
ラップされています:
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);
}
配列をArrayListに変換するには、開発者はしばしばこれを行います:
List<String> list = Arrays.asList(arr);// this is wrong way..
Arrays.asList()
は、 private static class inside Arrays
あるArrayListを返しますArrays.asList()
private static class inside Arrays
ではありません。 The java.util.Arrays.ArrayList
クラスにはset(), get(), contains()
メソッドがありますが、要素を追加するメソッドはありませんので、そのサイズは固定されています。 実際のArrayListを作成するには、以下を行う必要があります。
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));
ArrayListのコンストラクタは、 java.util.Arrays.ArrayList
スーパータイプでもあるCollection型を受け入れることができます
あなたはjava 8で次のようにすることができます
ArrayList<Element> list = (ArrayList<Element>)Arrays.stream(array).collect(Collectors.toList());
おそらくListだけでなく、ArrayListが必要です。 その場合は、次のようにすることができます:
List<Element> arraylist = Arrays.asList(array);
この質問はかなり古くなっているので、誰も一番単純な形をまだ示唆していないことは驚きです。
List<Element> arraylist = Arrays.asList(new Element(1), new Element(2), new Element(3));
Java 5以降では、 Arrays.asList()
はvarargsパラメータをとり、明示的に配列を構築する必要はありません。
これを行う最も簡単な方法は、次のコードを追加することです。 試してみた。
String[] Array1={"one","two","three"};
ArrayList<String> s1= new ArrayList<String>(Arrays.asList(Array1));
すでに誰もがあなたの問題に対して十分な答えを出してくれました。 今すぐすべての提案から、あなたの要件に合うものを決定する必要があります。 あなたが知る必要があるコレクションの2つのタイプがあります。 1つは修正されていないコレクションであり、後でそのオブジェクトを変更できる1つのコレクションです。
ここでは、2つのユースケースの短い例を示します。
不変なコレクションの作成::作成後にコレクションオブジェクトを変更したくない場合
List<Element> elementList = Arrays.asList(array)
変更可能なコレクションの作成::作成後に作成されたコレクションオブジェクトを変更したい場合。
List<Element> elementList = new ArrayList<Element>(Arrays.asList(array));
すべてこれがそうすると言ったように
new ArrayList<>(Arrays.asList(array))
配列を作成する一般的な最新の方法はobservableArraysです
ObservableList:リスナーが変更が発生したときにそれを追跡できるようにするリスト。
Java SEの場合は試すことができます
FXCollections.observableArrayList(new Element(1), new Element(2), new Element(3));
Oracle Docsによると
observableArrayList()arraylistによってサポートされている新しい空の観測可能リストを作成します。 observableArrayList(E ... items)項目が追加された新しい観測可能配列リストを作成します。
Java 9のアップデート
Java 9でも少し簡単です:
List<String> list = List.of("element 1", "element 2", "element 3");
もう1つのアップデートは、2014年をほぼ終わりとしています.Java 8でもこれを行うことができます:
ArrayList<Element> arrayList = Stream.of(myArray).collect(Collectors.toCollection(ArrayList::new));
これがちょうどList
である場合、いくつかの文字が保存されます
List<Element> list = Stream.of(myArray).collect(Collectors.toList());
与えられた:
Element[] array = new Element[] { new Element(1), new Element(2), new Element(3) };
つかいます:
List<Element> listArray = Arrays.asList(array);
別の方法( new ArrayList(Arrays.asList(array))
ソリューションと本質的に同等new ArrayList(Arrays.asList(array))
が、パフォーマンス面では、
Collections.addAll(arraylist, array);
別の簡単な方法は、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));
// Guava
import com.google.common.collect.ListsLists
...
List<String> list = Lists.newArrayList(aStringArray);
new ArrayList<>(Arrays.asList(array))