Відповіді:
Я погоджуюся з sepp2k, але є деякі інші деталі, які можуть мати значення:
new HashSet<Foo>(myList);
дасть вам несортований набір, який не має дублікатів. У цьому випадку дублювання визначається за допомогою методу .equals () на ваших об'єктах. Це робиться в поєднанні з методом .hashCode (). (Більше про рівність дивіться тут )
Альтернативою, яка дає відсортований набір, є:
new TreeSet<Foo>(myList);
Це працює, якщо Foo реалізує порівнянне. Якщо це не так, ви можете скористатися компаратором:
Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);
Це залежить або від сравнениеTo () (від порівнянного інтерфейсу), або порівняння () (від компаратора), щоб забезпечити унікальність. Отже, якщо ви просто піклуєтеся про унікальність, використовуйте HashSet. Якщо ви після сортування, то розгляньте TreeSet. (Пам’ятайте: Оптимізуйте пізніше!) Якщо питання щодо ефективності часу використовують HashSet, якщо важлива космічна ефективність, подивіться на TreeSet. Зауважте, що більш ефективні реалізації Set і Map доступні через Trove (та інші місця).
Якщо ви використовуєте бібліотеку Guava :
Set<Foo> set = Sets.newHashSet(list);
або, ще краще:
Set<Foo> set = ImmutableSet.copyOf(list);
ImmutableSet.of(), наприклад. EDIT: це може не бути фактором, оскільки всі перевантаження зайві.
За допомогою Java 8 ви можете використовувати stream:
List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));
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);
}
}
}
Я б здійснив перевірку Null перед перетворенням у встановлений.
if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}
Set<Foo> foo = myList == null ? Collections.emptySet() : new HashSet<Foo>(myList);
Ви можете конвертувати 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);
}
Для Java 8 це дуже просто:
List < UserEntity > vList= new ArrayList<>();
vList= service(...);
Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());
new ArrayList<>();-)
Java - addAll
set.addAll(aList);
Java - новий об’єкт
new HashSet(list)
Java-8
list.stream().collect(Collectors.toSet());
Використання Гуви
Sets.newHashSet(list)
Apache Commons
CollectionUtils.addAll(targetSet, sourceList);
Java 10
var set = Set.copyOf(list);
Найкращий спосіб використовувати конструктор
Set s= new HashSet(list);
У java 8 ви також можете використовувати stream api ::
Set s= list.stream().collect(Collectors.toSet());
Існують різні способи отримати такий 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()він повертає набір і відповідно до doc : There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned. Якщо ми хочемо отримати HashSetто, ми можемо використовувати іншу альтернативу, щоб отримати набір (чек set3).
Завдяки Java 10 тепер ви можете Set#copyOfлегко перетворити List<E>на немодифікований Set<E>:
Приклад:
var set = Set.copyOf(list);
Майте на увазі , що це невпорядкований операція, і nullелементи НЕ допускається, так як вона буде кидати NullPointerException.
Якщо ви хочете, щоб він міг бути модифікованим, просто перенесіть його в конструктор для Setреалізації.
Більш стійке рішення для Java 8 Optional.ofNullable
Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);
Якщо ви використовуєте Eclipse Collection :
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який Setу Setsзаводський клас.
Set<Integer> set = Sets.mutable.withAll(List.of(1, 2, 3));
Існує більш пояснення змінюваних заводів , доступних в Eclipse , колекції тут .
Якщо ви хочете отримати ImmutableSetвід a List, ви можете скористатись Setsфабрикою наступним чином:
ImmutableSet<Integer> immutableSet = Sets.immutable.withAll(List.of(1, 2, 3))
Примітка. Я є членом колекції Eclipse
Пам’ятайте, що перетворення зі списку в набір видалить дублікати з колекції, оскільки 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: Ви також можете використовувати API Commons Collections для перетворення списку в набір: -
// 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());
SetтаMapхто використовується;HashSetтут передбачається .