web-dev-qa-db-ja.com

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

JavaでListSetに変換する最も簡単な方法は何ですか?

570
OHHAI
Set<Foo> foo = new HashSet<Foo>(myList);
985
sepp2k

私は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(そして他の場所)を通して利用可能であることに注意してください。

133
Spina

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

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

または、もっと良い:

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

Java 8を使用すると、streamを使用できます。

List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));
24
JimB
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);
        }
    }
}
16

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

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

Java 8では、とても簡単です。

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

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);
}
6
savanibharat

比較的新しい友達、 Java-8 stream APIを忘れないでください。リストに変換する前にリストを前処理する必要がある場合は、次のようにしてください。

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

Java 10では、Set#copyOfを変更不可能なList<E>に簡単に変換するために Set<E> を使用できます。

例:

var set = Set.copyOf(list);

これは順序付けられていない操作であり、null要素はNullPointerExceptionをスローするため、 not は許可されていません。

変更可能にしたい場合は、単にSet実装をコンストラクタに渡してください。

3
Jacob G.

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

    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 returnedHashSetを取得したい場合は、他の代替手段を使用してセットを取得できます(set3を確認してください)。

3
i_am_zero

Java - addAll

set.addAll(aList);

Java - 新しいオブジェクト

new HashSet(list)

Java-8

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

Guvaを使う

 Sets.newHashSet(list)

アパッチコモンズ

CollectionUtils.addAll(targetSet, sourceList);
3

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

Set s= new HashSet(list);

Java 8ではstream api ::を使うこともできます。

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

Optional.ofNullableを使用した、よりJava 8の復元力のあるソリューション

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

Eclipse Collections を使用する場合:

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

MutableSetインターフェイスはJava.util.Setを拡張しますが、MutableIntSetインターフェイスは拡張しません。 Iterableファクトリクラスを使用して、SetSetsに変換することもできます。

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コレクションのコミッターです

1
Donald Raab