Java에서 목록을 세트로 변환하는 가장 쉬운 방법


628

Lista Set를 Java 로 변환하는 가장 쉬운 방법은 무엇입니까 ?

답변:


1065
Set<Foo> foo = new HashSet<Foo>(myList);

3
이 답변은 정답이지만 최상의 답변이 될만한 충분한 기술적 배경이 없습니다. 구현 SetMap사용 중인 구현에 따라 여기에 함정이 있기 때문 입니다. 여기 HashSet가정 합니다.
Madbreaks

145

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 구현을 사용할 수 있습니다.


맞춤 비교기 사용 사례를 포함 해 주셔서 감사합니다!
저스틴 파페 즈

70

Guava 라이브러리 를 사용하는 경우 :

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

또는 더 나은 :

Set<Foo> set = ImmutableSet.copyOf(list);

2
ImmutableSet.copyOf가 더 나은 이유는 무엇입니까?
user672009

1
구아바의 newHashSet ()은 기본 Java new HashSet ()에 비해 어떤 장점이 있습니까?
Nelda.

@ Nelda.techspiress javadoc 은 언제 메소드를 사용해야하는지에 대해 논의합니다. 마지막 부분을 참고하십시오. 이 방법은 그다지 유용하지 않으며 앞으로 더 이상 사용되지 않을 것입니다. 비록 조금 놀랐지 만 일관성은 예를 들어와 같이 요인으로 언급되지 않았습니다 ImmutableSet.of(). 편집 : 모든 과부하가 불필요 하기 때문에 요인이 될 수 없습니다 .
shmosel

1
@shmosel을 참조 해 주셔서 감사합니다. 그러나 경험적 지식을 더 찾고있었습니다. 구아바를 사용한 사람들에게 왜 구아바가 HashSet보다 선택 되었습니까?
Nelda.tech

27

Java 8을 사용하면 스트림을 사용할 수 있습니다.

List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));

10
이것에 대해 성능 페널티를 확인 했습니까? 이것은 iterable + iterator, 새로운 HashSet ()을 수행 한 다음 각 목록 항목에 대해 새 세트에 대한 addAll () 호출을 수행합니다. 전반적으로, cca. 새로운 HashSet (list)처럼 간단한 것을 위해 만들어진 5 개의 객체.
Agoston Horvath

1
@AgostonHorvath 귀하의 의견에 감사드립니다. 원래 여기에 왔을 때 그 정보를 찾고있었습니다.
TheRealChx101 2018 년

17
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);
        }
    }
}

1
완전한 코드 예제는 +1입니다. 여기서 한 가지 추가 참고 사항은 해싱이 실행마다 동일하게 보장되지는 않는다는 것입니다. 즉, 'Set values ​​.....'뒤에 인쇄 된 목록은 한 번의 'ABC'이고 다른 번의 'CBA'일 수 있습니다. 내 답변에서 언급했듯이 안정적인 순서를 얻기 위해 트리 세트를 사용할 수 있습니다. 다른 옵션은 항목이 추가 된 순서를 기억하는 LinkedHashSet을 사용하는 것입니다.
Spina

8

set으로 변환하기 전에 Null 검사를 수행합니다.

if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}

3
또는Set<Foo> foo = myList == null ? Collections.emptySet() : new HashSet<Foo>(myList);
vegemite4me

6

당신은로 변환 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);
}

List에서 Set으로 캐스팅하는 것을 의미한다고 생각합니다.
Simon

6

Java 8의 경우 매우 쉽습니다.

List < UserEntity > vList= new ArrayList<>(); 
vList= service(...);
Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());

"실제"Java 8은 new ArrayList<>();-) 를 사용합니다 .
JR

6

자바 - 오퍼레이션과 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);

5

비교적 새로운 친구를 잊지 말고 스트림 API. 목록을 세트로 변환하기 전에 사전 처리해야하는 경우 다음과 같은 것이 좋습니다.

list.stream().<here goes some preprocessing>.collect(Collectors.toSet());

4

생성자를 사용하는 가장 좋은 방법

Set s= new HashSet(list);

Java 8에서는 스트림 api :를 사용할 수도 있습니다.

Set s= list.stream().collect(Collectors.toSet());

3

Setas 를 얻는 방법에는 여러 가지가 있습니다 .

    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).


3

Java 10에서는 Set#copyOfa List<E>를 수정할 수없는 것으로 쉽게 변환하는 데 사용할 수 있습니다 Set<E>.

예:

var set = Set.copyOf(list);

이 작업은 정렬되지 않은 작업이므로 null요소 를 던질 수 있으므로 요소가 허용 되지 않습니다NullPointerException .

수정 가능하게하려면 Set구현 자 에게 생성자에 전달하면됩니다 .


2

더 많은 Java 8 복원 솔루션 Optional.ofNullable

Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);

2

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인터페이스는하지 않습니다. 당신은 또한 어떤을 변환 할 수 있습니다 IterableA가에 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의 커미터입니다.


0

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()); 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.