質問

次のように初期化された配列があります。

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

これは正常に動作します。しかし、いくつかの警告:

  1. asListから返されるリストのサイズは固定サイズです。そのため、コードで返されたリストに要素を追加または削除できるようにするには、新しいArrayListで要素をラップする必要があります。それ以外の場合は、UnsupportedOperationExceptionを取得します。
  2. 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));

myArrayTと同じタイプであることを確認してください。たとえば、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を作成できます:

<*>

CollectionsArrays、または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); 

さまざまな方法で変換できます

  1. List<Element> list = Arrays.asList(array);

  2. List<Element> list = new ArrayList();
    Collections.addAll(list, array);

  3. 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());
}
  1. 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として渡すことができます。

  2. この質問には別の答えがあるかもしれません。
    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))
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top