Самый простой способ конвертировать список в набор в Java - PullRequest
576 голосов
/ 16 сентября 2009

Какой самый простой способ преобразовать List в Set в Java?

Ответы [ 15 ]

994 голосов
/ 16 сентября 2009
Set<Foo> foo = new HashSet<Foo>(myList);
136 голосов
/ 16 сентября 2009

Я согласен с 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 (и другие места).

66 голосов
/ 20 июля 2012

Если вы используете библиотеку Guava :

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

или, что лучше:

Set<Foo> set = ImmutableSet.copyOf(list);
24 голосов
/ 13 апреля 2015

Используя Java 8, вы можете использовать поток:

List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));
17 голосов
/ 19 апреля 2013
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);
        }
    }
}
9 голосов
/ 13 мая 2014

Я бы выполнил проверку Null перед преобразованием в set.

if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}
6 голосов
/ 07 ноября 2015

Для Java 8 это очень просто:

List < UserEntity > vList= new ArrayList<>(); 
vList= service(...);
Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());
6 голосов
/ 19 декабря 2014

Вы можете конвертировать 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);
}
5 голосов
/ 30 мая 2017

Давайте не забудем нашего относительно нового друга, stream API. Если вам нужно предварительно обработать список перед преобразованием его в набор, лучше иметь что-то вроде:

list.stream().<here goes some preprocessing>.collect(Collectors.toSet());
3 голосов
/ 30 января 2019

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...