Câu trả lời:
Tôi đồng ý với sepp2k, nhưng có một số chi tiết khác có thể quan trọng:
new HashSet<Foo>(myList);
sẽ cung cấp cho bạn một bộ chưa sắp xếp mà không có bản sao. Trong trường hợp này, sao chép được xác định bằng phương thức .equals () trên các đối tượng của bạn. Điều này được thực hiện kết hợp với phương thức .hashCode (). (Để biết thêm về bình đẳng xem tại đây )
Một thay thế cung cấp một bộ sắp xếp là:
new TreeSet<Foo>(myList);
Điều này hoạt động nếu Foo thực hiện so sánh. Nếu không, bạn có thể muốn sử dụng một bộ so sánh:
Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);
Điều này phụ thuộc vào so sánh () (từ giao diện so sánh) hoặc so sánh () (từ bộ so sánh) để đảm bảo tính duy nhất. Vì vậy, nếu bạn chỉ quan tâm đến tính độc đáo, hãy sử dụng Hashset. Nếu bạn sau khi sắp xếp, hãy xem xét TreeSet. (Hãy nhớ: Tối ưu hóa sau!) Nếu vấn đề hiệu quả về thời gian sử dụng Hashset nếu hiệu quả không gian có vấn đề, hãy nhìn vào TreeSet. Lưu ý rằng việc triển khai Set và Map hiệu quả hơn có sẵn thông qua Trove (và các vị trí khác).
Nếu bạn sử dụng thư viện Guava :
Set<Foo> set = Sets.newHashSet(list);
hoặc tốt hơn:
Set<Foo> set = ImmutableSet.copyOf(list);
ImmutableSet.of()
ví dụ như với nó . EDIT: nó có thể không phải là yếu tố vì tất cả các quá tải là không cần thiết.
Sử dụng java 8 bạn có thể sử dụng luồng:
List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));
Set<E> alphaSet = new HashSet<E>(<your List>);
hoặc ví dụ hoàn chỉnh
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);
}
}
}
Tôi sẽ thực hiện kiểm tra Null trước khi chuyển đổi thành thiết lập.
if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}
Set<Foo> foo = myList == null ? Collections.emptySet() : new HashSet<Foo>(myList);
Bạn có thể chuyển đổi List<>
sangSet<>
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);
}
Đối với Java 8, nó rất dễ dàng:
List < UserEntity > vList= new ArrayList<>();
vList= service(...);
Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());
new ArrayList<>()
;-)
Java - add ALL
set.addAll(aList);
Java - Đối tượng mới
new HashSet(list)
Java-8
list.stream().collect(Collectors.toSet());
Sử dụng Guva
Sets.newHashSet(list)
Cộng đồng Apache
CollectionUtils.addAll(targetSet, sourceList);
Java 10
var set = Set.copyOf(list);
Cách tốt nhất để sử dụng constructor
Set s= new HashSet(list);
Trong java 8, bạn cũng có thể sử dụng luồng api ::
Set s= list.stream().collect(Collectors.toSet());
Có nhiều cách khác nhau để có được Set
như:
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);
Khi chúng tôi sử dụng, Collectors.toSet()
nó trả về một tập hợp và theo tài liệu : There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned
. Nếu chúng ta muốn lấy HashSet
thì chúng ta có thể sử dụng phương án khác để lấy một bộ (kiểm tra set3
).
Với Java 10, giờ đây bạn có thể sử dụng Set#copyOf
để dễ dàng chuyển đổi List<E>
thành không thể thay đổi Set<E>
:
Thí dụ:
var set = Set.copyOf(list);
Hãy nhớ rằng đây là một hoạt động không có thứ tự và null
các yếu tố không được phép, vì nó sẽ ném một NullPointerException
.
Nếu bạn muốn nó có thể sửa đổi, thì chỉ cần chuyển nó vào hàm tạo Set
.
Một giải pháp linh hoạt hơn Java 8 với Optional.ofNullable
Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);
Nếu bạn sử dụng Bộ sưu tập Eclipse :
MutableSet<Integer> mSet = Lists.mutable.with(1, 2, 3).toSet();
MutableIntSet mIntSet = IntLists.mutable.with(1, 2, 3).toSet();
Các MutableSet
giao diện mở rộng java.util.Set
trong khi MutableIntSet
giao diện thì không. Bạn cũng có thể chuyển đổi bất kỳ Iterable
sang Set
sử dụng Sets
lớp nhà máy.
Set<Integer> set = Sets.mutable.withAll(List.of(1, 2, 3));
Có nhiều lời giải thích về các nhà máy có thể thay đổi có sẵn trong Bộ sưu tập Eclipse ở đây .
Nếu bạn muốn một ImmutableSet
từ a List
, bạn có thể sử dụng Sets
nhà máy như sau:
ImmutableSet<Integer> immutableSet = Sets.immutable.withAll(List.of(1, 2, 3))
Lưu ý: Tôi là người đi làm cho Bộ sưu tập Eclipse
Hãy nhớ rằng, chuyển đổi từ List sang Set sẽ xóa các bản sao khỏi bộ sưu tập vì List hỗ trợ các bản sao nhưng Set không hỗ trợ các bản sao trong Java.
Chuyển đổi trực tiếp: Cách phổ biến và đơn giản nhất để chuyển đổi Danh sách thành Tập hợp
// 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);
Bộ sưu tập Commons của Apache: Bạn cũng có thể sử dụng API Bộ sưu tập Commons để chuyển đổi Danh sách thành Tập hợp: -
// 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);
Sử dụng Luồng: Một cách khác là chuyển đổi danh sách đã cho thành luồng, sau đó truyền phát thành:
// 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
vàMap
sử dụng cái nào;HashSet
được giả định ở đây.