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以降のListSet 、および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))




type-conversion