Set <T>를 List <T>로 변환하는 가장 간결한 방법


201

예를 들어, 나는 현재 이것을하고있다 :

Set<String> setOfTopicAuthors = ....

List<String> list = Arrays.asList( 
    setOfTopicAuthors.toArray( new String[0] ) );

이길 수 있습니까?


2
사용 java.util.Collection: O (0)

@Carl, List가 필요한 타사 인터페이스에 Set을 제출해야합니다. @Tim Collection을 사용하기 위해 타사 인터페이스를 변경할 수 있기를 바랍니다.
Jacques René Mesrine

1
내가 참조; 이상한 제약을 없애고 나는 Roger의 대답과 함께 갈 것입니다. 그러나 실제로 List를 다시 사용하지 않으면 아무것도 할당하지 않습니다 (즉, foo.api (list) 대신 foo.api (new ArrayList <String> (listOfTopicAuthors)) 사용).
Carl

2
@ JacquesRenéMesrine : 문제의 첫 번째 코드는 오도의 소지가 있습니다 : 예상 : Set<String> setOfTopicAuthors = ....실제 :Set<String> listOfTopicAuthors = ....
realPK

또는 동일한 작업을 수행하는 다른 방법 List<String> list = Arrays.asList(setOfTopicAuthors.toArray(String[]::new))은 링크 된 답변에 자세히 설명되어 있습니다 .
Naman

답변:


432
List<String> list = new ArrayList<String>(listOfTopicAuthors);

1
... 그래서 oracle.com/technetwork/java/javase/documentation/… 와 같은 Java 코드 규칙을 근본적으로 무시 합니다 . :) :)
Håvard Geithus

그 후 list 요소에 액세스하려고 할 때 "java.lang.ClassCastException : java.lang.Integer를 java.lang.String으로 캐스트 할 수 없습니다"라는 오류 메시지가 표시됩니다. (int) 그게 다야 ... 어떤 제안?
CoDe

2
난 당신의 형식 매개 변수 생략 할 수 있습니다 자바 7 위 믿고 ArrayList: 항복 List<String> l = new ArrayList<>(listOfTopicAuthors); 외부 라이브러리를 사용하지 않고 대부분의 간결한를?
Brett Duncavage

listOfTopicAuthorsnull 인 경우 NullPointerException이 발생 합니다.
w35l3y

91
List<String> l = new ArrayList<String>(listOfTopicAuthors);

4
수락 된 답변과 같은 순간에 대답하고 신념을 얻지 못했습니다. +1
jayeffkay

@ Adamski 나는 인덱스가 0이 아닌 1에서 시작하는 목록으로 끝납니다. 어떤 치료법이 있습니까?
Jack

1
@ 잭 : 그건 사실이 아닙니다. java.util.List의 Javadoc에서 : "Java 배열과 같은 목록은 0부터 시작합니다."
Adamski

@Adamski 답변 주셔서 감사합니다. 나는 목록이 0을 기반으로해야하며 이것이 나에게 너무 이상한 이유임을 알고 있습니다. 내 집합을 목록으로 변환 한 후 foreach, sort 등의 반복 작업을 수행 할 수 없습니다 .NullPointerException이 발생하지만 목록에 예상되는 요소가 없으면 NullPointerException이 발생하지만 유일한 이상한 점은 색인은 1에서 시작합니다. 그러나 일반 목록을 만들면 색인은 0에서 시작합니다.
Jack

1
@ 잭 : 정말 이상하게 들립니다. 코드를 별도의 질문으로 게시하면 누군가가 당신을 도울 수 있다고 확신합니다.
Adamski

23

우리는 Set<String> stringSet다음을 사용할 수 있다고 생각합니다 .

Java 10 (수정 불가능한 목록)

List<String> strList = stringSet.stream().collect(Collectors.toUnmodifiableList());

Java 8 (수정 가능한 목록)

import static java.util.stream.Collectors.*;
List<String> stringList1 = stringSet.stream().collect(toList());

방법에 대한 의사 에 따라toList()

리턴 된 List의 유형, 변경 가능성, 직렬화 가능성 또는 스레드 안전성에 대한 보장은 없습니다. 리턴 된 List에 대한 추가 제어가 필요한 경우 toCollection (Supplier)을 사용하십시오.

따라서 특정 구현이 필요한 경우 예를 들어 다음과 ArrayList같이 얻을 수 있습니다.

List<String> stringList2 = stringSet.stream().
                              collect(toCollection(ArrayList::new));

Java 8 (수정 불가능한 목록)

Collections::unmodifiableList메소드 를 사용 하고 이전 예제에서 리턴 된 목록을 랩핑 할 수 있습니다 . 우리는 또한 다음과 같이 자신 만의 커스텀 메소드를 작성할 수 있습니다 :

class ImmutableCollector {
    public static <T> Collector<T, List<T>, List<T>> toImmutableList(Supplier<List<T>> supplier) {
            return Collector.of( supplier, List::add, (left, right) -> {
                        left.addAll(right);
                        return left;
                    }, Collections::unmodifiableList);
        }
}

그런 다음 다음과 같이 사용하십시오.

List<String> stringList3 = stringSet.stream()
             .collect(ImmutableCollector.toImmutableList(ArrayList::new)); 

또 다른 가능성은 collectingAndThen결과를 반환하기 전에 최종 변환을 수행 할 수있는 방법을 사용하는 것입니다.

    List<String> stringList4 = stringSet.stream().collect(collectingAndThen(
      toCollection(ArrayList::new),Collections::unmodifiableList));

주에 점은 방법이 있다는 것입니다 Collections::unmodifiableList에 따라, 지정된리스트의 변경 불가능한 뷰를 반환 문서 . 수정할 수없는보기 모음은 수정할 수없는 모음이며 배경 모음에 대한보기이기도합니다. 백업 모음에 대한 변경은 여전히 ​​가능할 수 있으며, 변경이 발생하면 수정할 수없는보기를 통해 볼 수 있습니다. 그러나 콜렉터 메소드 Collectors.unmodifiableListJava 10 에서 진정한 불변 목록을 리턴합니다 .


나는 변환이 사용 Set<Double>A를 List<Double집합이 어디에서 왔는지, LinkedHashMap.keySet()방법. Eclipse는 유형 불일치가 있으며에서 Object로 변환 할 수 없다고 말했습니다 List<Double>. 왜 이런 일이 있었는지 말해 줄 수 있습니까? 나는 그것을 캐스팅하여 해결했지만 왜 그런지 궁금했습니다.
Ungeheuer

1
예, Java 개발자는 점점 더 많은 Java 8 기능을 사용해야하므로이 답변이 위의 2 답변보다 낫습니다.
Shubham Pandey

13

이것을 설정하십시오 :

Set<String> listOfTopicAuthors = .....
List<String> setList = new ArrayList<String>(listOfTopicAuthors); 

Map을 위해 이것을보십시오 :

Map<String, String> listOfTopicAuthors = .....
// List of values:
List<String> mapValueList = new ArrayList<String>(listOfTopicAuthors.values());
// List of keys:
List<String> mapKeyList = new ArrayList<String>(listOfTopicAuthors.KeySet());

2

Guava를 사용하는 경우 Lists 클래스 newArrayList에서 메소드 를 정적으로 가져옵니다 .

List<String> l = newArrayList(setOfAuthors);

0

코드의 컨텍스트를 통해 정확히 무엇을하고 있는지 확실하지 않지만 ...

listOfTopicAuthors변수를 전혀 만들지 않습니까?

List<String> list = Arrays.asList((....).toArray( new String[0] ) );

"...."은 새로운 것이든지 다른 위치에서 온 것이 든 세트가 작동한다는 것을 나타냅니다.

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