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


628

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

답변:


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

3
이 답변은 정답이지만 최상의 답변이 될만한 충분한 기술적 배경이 없습니다. 구현 Set및 Map사용 중인 구현에 따라 여기에 함정이 있기 때문 입니다. 여기 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.