Відповіді:
Я погоджуюся з 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
тут передбачається .