Java에서 세트를 목록으로 정렬하려면 어떻게합니까?


169

Java Set에는가 있고 정렬 된로 바꾸고 싶습니다 List. 의 방법이 java.util.Collections나를 위해이 작업을 수행 할 패키지는?

답변:


214

OP제공하는 답변 이 최선이 아닙니다. 이 새로운를 생성으로는 비효율적입니다 List 불필요한 새로운 배열. 또한 일반 배열과 관련된 유형 안전 문제로 인해 "확인되지 않은"경고가 발생합니다.

대신 다음과 같이 사용하십시오.

public static
<T extends Comparable<? super T>> List<T> asSortedList(Collection<T> c) {
  List<T> list = new ArrayList<T>(c);
  java.util.Collections.sort(list);
  return list;
}

사용법 예는 다음과 같습니다.

Map<Integer, String> map = new HashMap<Integer, String>();
/* Add entries to the map. */
...
/* Now get a sorted list of the *values* in the map. */
Collection<String> unsorted = map.values();
List<String> sorted = Util.asSortedList(unsorted);

3
감사! SuppressWarnings는 항상 나를 귀찮게했습니다.
Jeremy Stein

4
@sunleo Util클래스는 asSortedList()내가 작성한 메소드 를 포함하는 클래스입니다 . 즉, Util클래스를 직접 작성하고 해당 코드를 클래스에 넣습니다.
erickson

1
하하 나는 기본 팩에서 java.util과 같은 것을 알았습니다. 감사합니다.
sunleo

3
이것은 훌륭한 일반 유틸리티 기능 일 수 있지만 실제로는 여전히 효율적이지 않습니다. 올바른 컨테이너에 세트가 있는지 확인하여 전체 정렬을 고려하십시오. 또한 TreeSet을 데이터의 직접 컨테이너로 사용하는 것도 고려하십시오. 데이터가 어쨌든 고유해야하고 세트가 필요한 경우 TreeSet을 사용하여 한 번에 두 개의 파리를 잡습니다.
YoYo

1
사람들이 최고 답변 만 읽는 것에 대한 참고 사항 : Java 8 스트림을 사용하는 nschum의 답변을 아래에서 살펴보십시오. Java 8을 사용할 수 있다면 사용하십시오. 더 유연하고 효율적입니다.
Felk

74

정렬 된 세트 :

return new TreeSet(setIWantSorted);

또는:

return new ArrayList(new TreeSet(setIWantSorted));

이것은 나의 첫번째 생각이었다. 그러나 asker는 목록을 원했다
Alex B

@Alex :이 방법은 여전히 ​​사용할 수 있습니다. 새로운 ArrayList (new TreeSet (setIWantSorted))를 반환
Jonik

1
실제로이 솔루션을 사용했지만 조언하지는 않습니다. TreeSet 상태에 대한 문서 ( download.oracle.com/javase/1.4.2/docs/api/java/util/… 참조 )에서 equals () 메소드 대신 compareTo () 메소드를 효과적으로 사용합니다. 세트에 equals () 결과가 동일한 두 개의 객체가 있으면 중복으로 표시되어 TreeSet에 추가되지 않습니다. 조심하십시오.
fwielstra

24
@fwielstra : 입력 값이 Set? 이기 때문에 입력 값이 같은 객체를 어떻게 가질 수 있습니까?
ryanprayogo

2
@ryanprayogo s뿐만 아니라 s 도 new TreeSet허용 하므로 언급 할 가치가 있습니다. 이 답변을 읽는 모든 사람이 원래 질문에 묻더라도을 사용 하지는 않습니다. CollectionSetSet
Chris

44
List myList = new ArrayList(collection);
Collections.sort(myList);

… 그러나 트릭을해야합니다. 해당되는 경우 Generics로 플레이버를 추가하십시오.


커뮤니티에 기부하고 싶은 유용한 스 니펫이있었습니다. 정보를 검색했을 때 찾을 수 없었습니다. 나는 다음 사람의 일을 더 쉽게하기 위해 노력하고있었습니다. stackoverflow.com/questions/18557/…
Jeremy Stein

1
네, 물론, 당신이 제공 한 그 링크는 실제로 실제 질문 에 대해 이야기하고 있습니다 (즉, 대답이없는 질문을 찾으십시오). 여기서 당신의 질문은 단지 답을주는 것이 었습니다. 저는 실제로 수백 개의 질문을 입력하고 스스로 대답 할 수있었습니다. 그것은 요점이 아니다!
Seb

5
@Seb : 동의하지 않습니다. 이 질문에 아무런 문제가 없습니다. 분명히 매우 간단한 질문은 아니 었으며 이제는 이전보다 더 나은 방법을 알고 있습니다!
Michael Myers

3
그것은 이었다 진짜 질문,하지만 구글은 짧은 등장 이후 나는 대답 나 자신을 발견했다. 그 당시에는 스택 오버 플로우가 없었습니다. 나는 내 웹 사이트에 게시했고 다른 사람을 도왔으므로 여기에서 유용 할 것이라고 생각했습니다.
Jeremy Stein

보너스 : 자신의 객체 유형을 정렬하는 경우 항상 메소드를 구현 Comparable하고 재정의 할 수 있습니다 compareTo.
랍스터

42

다음은 Java 8 스트림으로 수행 할 수있는 방법입니다.

mySet.stream().sorted().collect(Collectors.toList());

또는 커스텀 비교기 사용 :

mySet.stream().sorted(myComparator).collect(Collectors.toList());

9

정렬 구현을 제공하기 위해 Comparator 또는 Comparable 인터페이스를 사용하는 것이 항상 안전합니다 (오브젝트가 기본 데이터 유형의 String 또는 Wrapper 클래스가 아닌 경우). 이름을 기준으로 직원을 정렬하기위한 비교기 구현의 예로

    List<Employees> empList = new LinkedList<Employees>(EmpSet);

    class EmployeeComparator implements Comparator<Employee> {

            public int compare(Employee e1, Employee e2) {
                return e1.getName().compareTo(e2.getName());
            }

        }

   Collections.sort(empList , new EmployeeComparator ());

Comparator는 동일한 객체에 대해 다른 정렬 알고리즘이 필요할 때 유용합니다 (예 : emp name, emp salary 등). 필요한 객체에 대한 비교 가능한 인터페이스를 사용하여 단일 모드 정렬을 구현할 수 있습니다.


5

이를 수행하는 단일 방법은 없습니다. 이것을 사용하십시오 :

@SuppressWarnings("unchecked")
public static <T extends Comparable> List<T> asSortedList(Collection<T> collection) {
  T[] array = collection.toArray(
    (T[])new Comparable[collection.size()]);
  Arrays.sort(array);
  return Arrays.asList(array);
}

Collections.sort 함수도 있지만 같은 일을한다고 생각합니다. 어쨌든 +1.
CookieOfFortune 2009

1
Collections.sort는 목록을 매개 변수로 사용합니다.
Jeremy Stein

3

세트를으로 변환 ArrayList하여를 ArrayList사용하여 정렬 할 수 있습니다 Collections.sort(List).

코드는 다음과 같습니다.

keySet = (Set) map.keySet();
ArrayList list = new ArrayList(keySet);     
Collections.sort(list);

3
TreeSet sortedset = new TreeSet();
sortedset.addAll(originalset);

list.addAll(sortedset);

여기서 originalset = 정렬되지 않은 세트 및 list = 반환 될 목록


TreeSet은 목록을 제거하여 그 결과를 가정하지 않으면 잘못된 결과를 초래할 수 있습니다.
anthonymonori

2

@ Jeeremy Stein 나는 동일한 코드를 구현하고 싶었다. 또한 세트를 목록으로 정렬하고 싶었으므로 세트를 사용하는 대신 세트 값을 목록으로 변환하고 해당 목록을 변수로 정렬했습니다. 이 코드가 도움이되었습니다.

set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList());

0

이 코드를 사용하고 있는데 위의 답변보다 더 실용적입니다.

List<Thing> thingList = new ArrayList<>(thingSet);
thingList.sort((thing1, thing2) -> thing1.getName().compareToIgnoreCase(thing2.getName()));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.