Set <T>をList <T>に変換する最も簡潔な方法


201

たとえば、私は現在これをやっています:

Set<String> setOfTopicAuthors = ....

List<String> list = Arrays.asList( 
    setOfTopicAuthors.toArray( new String[0] ) );

勝てますか?


2
使用java.util.Collection:O(0)
Tim

@Carl、リストを必要とするサードパーティのインターフェイスにセットを送信する必要があります。@Timサードパーティのインターフェースをコレクションを使用するように変更できるといいのですが。
JacquesRenéMesrine、2010

1
そうですか; 奇妙な制約を除いて、私はロジャーの答えで行くでしょう。ただし、リストを実際に再度使用しない限り、リストへの割り当てはスキップします(つまり、foo.api(list)の代わりにfoo.api(new ArrayList <String>(listOfTopicAuthors))を使用します)。
カール

2
@JacquesRenéMesrine:問題のコードの最初の行は誤解を招く:期待される:Set<String> setOfTopicAuthors = ....実際:Set<String> listOfTopicAuthors = ....
realPK 2017

または、同じことを行う別の方法List<String> list = Arrays.asList(setOfTopicAuthors.toArray(String[]::new))は、リンクされた回答に詳述されています。
ナマン

回答:


432
List<String> list = new ArrayList<String>(listOfTopicAuthors);

1
...そして、それによってJavaコードの慣習に根本的に挑む:oracle.com/technetwork/java/javase/documentation/…!:) :)
HåvardGeithus

この後、リスト要素にアクセスしようとすると、「java.lang.ClassCastException:java.lang.Integer cannot be cast to java.lang.String」..don; t。理由はわかりません。単純なlist.getです。 (int)それだけです...何か提案はありますか?
CoDe、2014年

2
私は、Java 7で、あなたがに型パラメータを省略することができ、上記と信じてArrayList:降伏 List<String> l = new ArrayList<>(listOfTopicAuthors); ほとんど簡潔に外部ライブラリを使用せずに?
Brett Duncavage 2014年

listOfTopicAuthorsnullの場合、NullPointerExceptionをスローします。
w35l3y

91
List<String> l = new ArrayList<String>(listOfTopicAuthors);

4
受け入れられた答えと同じ分で答え、信用を得られなかったため。+1
jayeffkay

@Adamskiインデックスが0ではなく1から始まるリストになってしまいます。
ジャック

1
@ジャック:それは間違いなくそうではありません。java.util.ListのJavadocから:「リスト(Java配列のような)はゼロベースです。」
アダムスキー、

@Adamski回答ありがとうございます。私はリストがゼロである必要があることを知っているので、これは私にとってとても奇妙です。セットをリストに変換した後、foreach、sortなどの反復操作を実行できなくなります。ただし、NullPointerExceptionが発生しますが、リストを期待している場合、要素がnullでなく、唯一の奇妙なことに、インデックスは1から始まりますが、通常のリストを作成しただけの場合、インデックスは0から始まります。
ジャック

1
@ジャック:それは非常に奇妙に聞こえます。コードを別の質問として投稿した場合、誰かがあなたを手伝ってくれると思います。
アダムスキー、

23

Set<String> stringSet以下を使用できることを考慮してください。

Java 10(変更不可能なリスト)

List<String> strList = stringSet.stream().collect(Collectors.toUnmodifiableList());

Java 8(変更可能なリスト)

import static java.util.stream.Collectors.*;
List<String> stringList1 = stringSet.stream().collect(toList());

メソッドのドキュメントに従ってtoList()

返されるListのタイプ、変更可能性、直列化可能性、またはスレッドセーフ性は保証されません。返されたリストをさらに制御する必要がある場合は、toCollection(Supplier)を使用します。

したがって、特定の実装が必要な場合は、たとえばArrayList次のようにして取得できます。

List<String> stringList2 = stringSet.stream().
                              collect(toCollection(ArrayList::new));

Java 8(変更不可能なリスト)

Collections::unmodifiableListメソッドを利用して、前の例で返されたリストをラップできます。独自のカスタムメソッドを次のように記述することもできます。

class ImmutableCollector {
    public static <T> Collector<T, List<T>, List<T>> toImmutableList(Supplier<List<T>> supplier) {
            return Collector.of( supplier, List::add, (left, right) -> {
                        left.addAll(right);
                        return left;
                    }, Collections::unmodifiableList);
        }
}

そしてそれを次のように使用します:

List<String> stringList3 = stringSet.stream()
             .collect(ImmutableCollector.toImmutableList(ArrayList::new)); 

別の可能性は、 collectingAndThen結果を返す前に最終的な変換を行うことができるメソッドをことです:

    List<String> stringList4 = stringSet.stream().collect(collectingAndThen(
      toCollection(ArrayList::new),Collections::unmodifiableList));

注意すべき 1つのは、docのように、メソッドCollections::unmodifiableListが指定されたリストの変更不可能なビューを返すことです。変更不可能なビューコレクションは、変更不可能なコレクションであり、バッキングコレクションのビューでもあります。バッキングコレクションへの変更は引き続き可能であることに注意してください。変更が発生した場合は、変更不可能なビューから表示できます。しかし、コレクターメソッドは、Java 10では真に不変のリストを返します。Collectors.unmodifiableList


これを使用しSet<Double>てa をに変換しList<Double、セットはLinkedHashMap.keySet()メソッドから取得されました。Eclipseから、型の不一致があり、からObjectに変換できないと言われましたList<Double>。なぜこれが起こったのか教えてください。キャスティングで回避したのですが、どうしてそうなるのか迷っていました。
Ungeheuer 2016年

1
はい、Java開発者はより多くのJava 8機能を使用する必要があるため、この回答は上記の2つの回答よりも優れています。
Shubham Pandey 2017

13

セットにこれを試してください:

Set<String> listOfTopicAuthors = .....
List<String> setList = new ArrayList<String>(listOfTopicAuthors); 

これをマップに試してください:

Map<String, String> listOfTopicAuthors = .....
// List of values:
List<String> mapValueList = new ArrayList<String>(listOfTopicAuthors.values());
// List of keys:
List<String> mapKeyList = new ArrayList<String>(listOfTopicAuthors.KeySet());

2

Guavaを使用している場合はnewArrayListListsクラスから静的にメソッドをインポートします。

List<String> l = newArrayList(setOfAuthors);

0

あなたがコードのコンテキストを介して正確に何をしているのか本当にわかりませんが...

なぜlistOfTopicAuthors変数を作成するのですか?

List<String> list = Arrays.asList((....).toArray( new String[0] ) );

「....」は、セットが新しいものか、別の場所からのものかに関わらず、セットが機能したことを表します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.