답변:
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을보십시오. Trove (및 기타 위치)를 통해보다 효율적인 Set 및 Map 구현을 사용할 수 있습니다.
Guava 라이브러리 를 사용하는 경우 :
Set<Foo> set = Sets.newHashSet(list);
또는 더 나은 :
Set<Foo> set = ImmutableSet.copyOf(list);
ImmutableSet.of()
. 편집 : 모든 과부하가 불필요 하기 때문에 요인이 될 수 없습니다 .
Java 8을 사용하면 스트림을 사용할 수 있습니다.
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);
}
}
}
set으로 변환하기 전에 Null 검사를 수행합니다.
if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}
Set<Foo> foo = myList == null ? Collections.emptySet() : new HashSet<Foo>(myList);
Java 8의 경우 매우 쉽습니다.
List < UserEntity > vList= new ArrayList<>();
vList= service(...);
Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());
new ArrayList<>()
;-) 를 사용합니다 .
자바 - 오퍼레이션과 addAll
set.addAll(aList);
자바 - 새로운 객체
new HashSet(list)
자바 -8
list.stream().collect(Collectors.toSet());
구바 사용
Sets.newHashSet(list)
아파치 커먼즈
CollectionUtils.addAll(targetSet, sourceList);
자바 10
var set = Set.copyOf(list);
Set
as 를 얻는 방법에는 여러 가지가 있습니다 .
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
. 우리가 a를 얻으려면 HashSet
다른 대안을 사용하여 세트를 얻을 수 있습니다 (check set3
).
Java 10에서는 Set#copyOf
a List<E>
를 수정할 수없는 것으로 쉽게 변환하는 데 사용할 수 있습니다 Set<E>
.
예:
var set = Set.copyOf(list);
이 작업은 정렬되지 않은 작업이므로 null
요소 를 던질 수 있으므로 요소가 허용 되지 않습니다NullPointerException
.
수정 가능하게하려면 Set
구현 자 에게 생성자에 전달하면됩니다 .
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
A가에 Set
사용하여 Sets
팩토리 클래스를.
Set<Integer> set = Sets.mutable.withAll(List.of(1, 2, 3));
Eclipse Collections 에서 사용 가능한 가변 팩토리에 대한 자세한 설명은 여기에 있습니다 .
ImmutableSet
에서 원하는 경우 다음과 같이 팩토리를 List
사용할 수 있습니다 Sets
.
ImmutableSet<Integer> immutableSet = Sets.immutable.withAll(List.of(1, 2, 3))
참고 : 저는 Eclipse Collections의 커미터입니다.
List는 중복을 지원하지만 Set은 Java에서 중복을 지원하지 않기 때문에 List에서 Set으로 변환하면 컬렉션에서 중복이 제거됩니다.
직접 변환 : 목록을 집합으로 변환하는 가장 일반적이고 간단한 방법
// 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 Collections : Commons Collections API를 사용하여 List를 Set으로 변환 할 수도 있습니다.
// 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
에 가정 합니다.