Javaでリストをセットに変換する最も簡単な方法


回答:


1065
Set<Foo> foo = new HashSet<Foo>(myList);

3
正しいものの落とし穴がいるの実装に応じて、ここにありますので、この答えは、最高/受け入れ答えであることを保証するのに十分な技術的な文脈を欠いSetMap1が使用しています。ここでHashSet想定されています。
Madbreaks、

145

私はsepp2kに同意しますが、重要な他の詳細がいくつかあります。

new HashSet<Foo>(myList);

重複がないソートされていないセットを提供します。この場合、重複はオブジェクトの.equals()メソッドを使用して識別されます。これは.hashCode()メソッドと組み合わせて行われます。(平等の詳細についてはこちらをご覧ください

ソートされたセットを提供する別の方法は次のとおりです。

new TreeSet<Foo>(myList);

これは、FooがComparableを実装している場合に機能します。そうでない場合は、コンパレータを使用できます。

Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);

これは、一意性を保証するために、compareTo()(比較可能なインターフェースから)またはcompare()(コンパレータから)に依存します。したがって、一意性を重視する場合は、HashSetを使用してください。並べ替え後の場合は、TreeSetを検討してください。(注意:後で最適化してください!)時間効率が重要な場合はHashSetを使用し、スペース効率が重要な場合はTreeSetを確認してください。SetとMapのより効率的な実装は、Trove(およびその他の場所)から利用できることに注意してください。


カスタムコンパレータの使用例を含めていただきありがとうございます。
Justin Papez

70

Guavaライブラリを使用する場合:

Set<Foo> set = Sets.newHashSet(list);

または、より良い:

Set<Foo> set = ImmutableSet.copyOf(list);

2
なぜImmutableSet.copyOfが優れているのですか?
user672009

1
GuavaのnewHashSet()には、Javaの基本的な新しいHashSet()に比べてどのような利点がありますか?
Nelda.techspiress

@ Nelda.techspiress javadocは、メソッドを使用する必要があるかどうかを説明しています。最後の部分に注意してください。このメソッドはあまり有用ではなく、将来は非推奨になる可能性があります。ちなみに一貫性はImmutableSet.of()、たとえばのように、要素として言及されていないことに少し驚いていますが。編集:すべてのオーバーロードが不要なので、それは要因ではないかもしれません。
shmosel 2016年

1
リファレンス@shmoselに感謝しますが、私は経験的な知識をもっと探していました。Guavaを使用したことがある人にとって、HashSetよりもGuavaが選ばれるのはなぜですか?
Nelda.techspiress 2016年

27

java 8を使用すると、ストリームを使用できます。

List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));

10
これのパフォーマンスペナルティを確認しましたか?これにより、イテラブル+イテレーター、新しいHashSet()が実行され、リストアイテムごとに、新しいセットでaddAll()が呼び出されます。全体として、CCA。新しいHashSet(リスト)のような単純なもののために作成された5つのオブジェクト。
Agoston Horvath

1
@AgostonHorvathコメントありがとうございます。もともとここに来たときにその情報を探していました。
TheRealChx101

17
Set<E> alphaSet  = new HashSet<E>(<your List>);

または完全な例

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ListToSet
{
    public static void main(String[] args)
    {
        List<String> alphaList = new ArrayList<String>();
        alphaList.add("A");
        alphaList.add("B");
        alphaList.add("C");
        alphaList.add("A");
        alphaList.add("B");
        System.out.println("List values .....");
        for (String alpha : alphaList)
        {
            System.out.println(alpha);
        }
        Set<String> alphaSet = new HashSet<String>(alphaList);
        System.out.println("\nSet values .....");
        for (String alpha : alphaSet)
        {
            System.out.println(alpha);
        }
    }
}

1
完全なコード例は+1。ここでもう1つ注意すべき点は、ハッシュが実行間で同じであるとは限らないことです。つまり、「値の設定.....」の後に印刷されるリストは、ある実行では「ABC」、別の実行では「CBA」になる場合があります。私の回答で述べたように、ツリーセットを使用して安定した順序を取得できます。別のオプションは、アイテムが追加された順序を記憶するLinkedHashSetを使用することです。
Spina 2013

8

セットに変換する前にNullチェックを実行します。

if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}

3
それともSet<Foo> foo = myList == null ? Collections.emptySet() : new HashSet<Foo>(myList);
vegemite4me

6

あなたは、変換することができますList<>Set<>

Set<T> set=new HashSet<T>();

//Added dependency -> If list is null then it will throw NullPointerExcetion.

Set<T> set;
if(list != null){
    set = new HashSet<T>(list);
}

リストからセットにキャストするつもりだったと思います。
Simon

6

Java 8の場合は非常に簡単です。

List < UserEntity > vList= new ArrayList<>(); 
vList= service(...);
Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());

「本当の」Java 8はnew ArrayList<>();-) を使用することになります
JR

6

Java - addAll

set.addAll(aList);

Javaの - 新しいオブジェクト

new HashSet(list)

Java-8

list.stream().collect(Collectors.toSet());

Guvaの使用

 Sets.newHashSet(list)

Apache Commons

CollectionUtils.addAll(targetSet, sourceList);

Java 10

var set = Set.copyOf(list);

5

比較的新しい友達を忘れないでください。 ストリームAPI。リストをセットに変換する前にリストを前処理する必要がある場合は、次のようにすることをお勧めします。

list.stream().<here goes some preprocessing>.collect(Collectors.toSet());

4

コンストラクタを使用する最良の方法

Set s= new HashSet(list);

Java 8では、ストリームapi ::も使用できます。

Set s= list.stream().collect(Collectors.toSet());

3

Setas を取得するにはさまざまな方法があります。

    List<Integer> sourceList = new ArrayList();
    sourceList.add(1);
    sourceList.add(2);
    sourceList.add(3);
    sourceList.add(4);

    // Using Core Java
    Set<Integer> set1 = new HashSet<>(sourceList);  //needs null-check if sourceList can be null.

    // Java 8
    Set<Integer> set2 = sourceList.stream().collect(Collectors.toSet());
    Set<Integer> set3 = sourceList.stream().collect(Collectors.toCollection(HashSet::new));

    //Guava
    Set<Integer> set4 = Sets.newHashSet(sourceList);

    // Apache commons
    Set<Integer> set5 = new HashSet<>(4);
    CollectionUtils.addAll(set5, sourceList);

使用するCollectors.toSet()と、セットとドキュメントごとに返されます:There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned。を取得したい場合はHashSet、他の代替手段を使用してセットを取得できます(チェックset3)。


3

Java 10では、を使用Set#copyOfList<E>て、を変更不可能な形式に簡単に変換できるようになりましたSet<E>

例:

var set = Set.copyOf(list);

これは順不同の操作であり、をスローするため、null要素は許可されないことに注意してくださいNullPointerException

変更可能にする場合は、コンストラクタにSet実装を渡します。


2

よりJava 8の弾力性のあるソリューション Optional.ofNullable

Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);

2

Eclipseコレクションを使用する場合:

MutableSet<Integer> mSet = Lists.mutable.with(1, 2, 3).toSet();
MutableIntSet mIntSet = IntLists.mutable.with(1, 2, 3).toSet();

MutableSetインタフェースは延びjava.util.Set、一方MutableIntSetインタフェースがありません。あなたはまた、任意に変換することができますIterableSet使用するSetsファクトリクラス。

Set<Integer> set = Sets.mutable.withAll(List.of(1, 2, 3));

Eclipseコレクション利用可能な可変ファクトリーの詳細については、こちらをご覧ください

必要に応じてImmutableSetからのList、あなたは使用することができSets、次のように工場を:

ImmutableSet<Integer> immutableSet = Sets.immutable.withAll(List.of(1, 2, 3))

注:私はEclipseコレクションのコミッターです


0

ListからSetに変換すると、コレクションから重複が削除されます。Listは重複をサポートしていますが、SetはJavaでの重複をサポートしていないためです。

直接変換:リストをセットに変換する最も一般的で簡単な方法

// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");

// Converting a list to set
Set<String> set = new HashSet<>(list);

Apache Commons Collections: Commons Collections APIを使用してリストをセットに変換することもできます:-

// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");

// Creating a set with the same number of members in the list 
Set<String> set = new HashSet<>(4);

// Adds all of the elements in the list to the target set
CollectionUtils.addAll(set, list);

ストリームの使用:別の方法は、指定されたリストをストリームに変換し、次にストリームを設定することです:-

// Creating a list of strings 
List<String> list = Arrays.asList("One", "Two", "Three", "Four"); 

// Converting to set using stream 
Set<String> set = list.stream().collect(Collectors.toSet()); 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.