Java 컬렉션 정렬


78

Java 컬렉션이 있습니다.

Collection<CustomObject> list = new ArrayList<CustomObject>();

CustomObjectid필드는 현재 표시 목록 전에 그하여이 컬렉션을 정렬 할 id.

그렇게 할 수있는 방법이 있습니까?


답변:


156

비교기 사용 :

List<CustomObject> list = new ArrayList<CustomObject>();
Comparator<CustomObject> comparator = new Comparator<CustomObject>() {
    @Override
    public int compare(CustomObject left, CustomObject right) {
        return left.getId() - right.getId(); // use your logic
    }
};

Collections.sort(list, comparator); // use the comparator as much as u want
System.out.println(list);

또한을 CustomObject구현하는 Comparable경우 다음을 사용하십시오.Collections.sort(list)

JDK 8에서는 구문이 훨씬 간단합니다.

List<CustomObject> list = getCustomObjectList();
Collections.sort(list, (left, right) -> left.getId() - right.getId());
System.out.println(list);

훨씬 간단

List<CustomObject> list = getCustomObjectList();
list.sort((left, right) -> left.getId() - right.getId());
System.out.println(list);

가장 간단

List<CustomObject> list = getCustomObjectList();
list.sort(Comparator.comparing(CustomObject::getId));
System.out.println(list);

분명히 초기 코드는 JDK 8에도 사용할 수 있습니다.


한 번 이상 정렬하려면 어떻게해야합니까?
Hunter McMillen 2011-08-05

답변을 수정했습니다. 확인하세요. 비교기를 사용하는 방법을 이해할 수 있다면 분명히 큰 문제가 아닙니다. 한 번만 할 수 있다면 n
번도

Aye ... 클래스가 비교 가능하면 비교기를 전달할 필요가 없습니다 ... nice ..ta
Makky

6
Collections 유형의 메서드 sort (List <T>, Comparator <? super T>)는 인수 (Collection, Comparator)에 적용 할 수 없습니다. 컬렉션을 정렬 메서드에 전달할 수 없습니다.
너무

5
정렬 방법은 컬렉션이 아닌 목록에 대해 작동합니다. 이 예제가 작동하려면 목록 변수의 유형을 목록으로 변경해야합니다.
에릭 바실 릭

34

질문은 "Sort Collection"입니다. 그래서 당신은 사용할 수 없습니다Collections.sort(List<T> l, Comparator<? super T> comparator) .

몇 가지 팁 :

컬렉션 유형 :

Comparator<String> defaultComparator = new Comparator<String>() {
   @Override
   public int compare(String o1, String o2) {
       return o1.compareTo(o2);
   }
};

Collection<String> collection = getSomeStringCollection();
String[] strings = collection.toArray(new String[collection.size()]);
Arrays.sort(strings, defaultComparator);
List<String> sortedStrings = Arrays.asList(strings);

Collection<String> collection = getSomeStringCollection();
List<String> list = new ArrayList(collection);
Collections.sort(list, defaultComparator);
collection = list; // if you wish

목록 유형 :

List<String> list = getSomeStringList();
Collections.sort(list, defaultComparator);

세트 유형 :

Set<String> set = getSomeStringSet();
// Than steps like in 'For Collection type' section or use java.util.TreeSet
// TreeSet sample:
// Sorted using java.lang.Comparable.
Set<String> naturalSorted = new TreeSet(set);

Set<String> set = getSomeStringSet();
Set<String> sortedSet = new TreeSet(defaultComparator);
sortedSet.addAll(set);

Java 8 버전. 이 java.util.List#sort(Comparator<? super E> c)방법은

List<String> list = getSomeStringList();
list.sort(defaultComparator);

또는

List<String> list = getSomeStringList();
list.sort((String o1, String o2) -> o1.compareTo(o2));

또는 Comparable을 구현하는 유형의 경우 :

List<String> list = getSomeStringList();
list.sort(String::compareTo);

나는 4 년 전에이 질문을했고 당신은 지금 대답하고 있습니다.
Makky

8
답장 해 주셔서 감사합니다. 정말 감사합니다. 4 년이고 여전히 오답은 정답으로 표시됩니다. 나쁜 사람은 누구입니까?
Aliaksei Yatsau

2
@Makky는 목록에 대한 응답하지 콜렉션 becuase
님 침 스키

11

Comparable을 구현하지 않는 클래스가 있지만 여전히 필드 또는 메서드에서 정렬하려는 경우 약간 다른 예가 있습니다.

Collections.sort(allMatching, new Comparator<ClassOne>() {
  @Override public int compare(final ClassOne o1, final ClassOne o2) {
    if (o1.getMethodToSort() > o2.getMethodToSort()) {
      return 1;
    } else if (o1.getMethodToSort() < o2.getMethodToSort()) {
      return -1;
    }  
    return 0;
  }
});

구현 한 if 문 compareTo()은 이미 수행하는 작업을 정확히 수행 합니다.
Hunter McMillen 2011-08-05

차이점은이 예제에서 ClassOne 클래스는 비교 가능한 클래스가 아니며 Comparable을 구현하지 않는다는 것입니다. 컬렉션과 비교기를 사용하여 비교할 수없는 개체를 정렬하는 방법의 예를 보여 주려고했습니다. ClassOne에는 compareTo 메서드가 없습니다.
Shawn Vader

Java 6에서 작동하지
않음

Java 7 또는 8에서 집합을 사용하는 Collections.sort를 찾을 수 없습니다. 정의에 따라 List는 순서가 지정된 요소 시퀀스 인 반면 Set는 순서가 지정되지 않은 고유 한 요소 목록입니다. 세트 주문을 원하시면 TreeSet
Shawn Vader

7

Comparator인터페이스를 구현해야합니다 .

예:

public class CustomComparator implements Comparator<CustomObject> 
{
    @Override
    public int compare(CustomObject o1, CustomObject o2) {
        return o1.getId().compareTo(o2.getId());
    }
}

그런 다음 Collections 클래스 Collections.sort()메서드를 사용할 수 있습니다 .

Collections.sort(list, new CustomComparator());


5

많은 정답이 있지만이 답을 찾지 못했습니다. 컬렉션은 정렬 할 수 없으며 반복 만 할 수 있습니다.

이제 그것들을 반복하고 새로운 정렬 된 something. 여기에 대한 답변을 따르십시오.



4

Java 8부터 이제 람다를 사용하여 스트림으로 수행 할 수 있습니다.

list.stream().sorted(Comparator.comparing(customObject::getId))
             .foreach(object -> System.out.println(object));

2

sort를 사용하십시오 .

다음을 수행하면됩니다.

목록의 모든 요소는 Comparable 인터페이스를 구현해야합니다.

(또는 다른 사람들이 이미 말했듯이 그 아래 버전을 사용하십시오.)


0

SortedSet 및 Comparator. 비교기는 id 필드를 존중해야 합니다.


@Qwerky-나는 그가 목록을 가지고 있다는 것을 알고 있습니다. 나는 그에게 세트를 사용하라고 제안하고있다. 중복 및 게재 신청서를 유지하기를 원하지 않는 한.
Aravind Yarram 2011 년

0

Java 8에는 메소드 참조와 내장 comparing비교기를 결합하는 몇 가지 옵션이 있습니다 .

import static java.util.Comparator.comparing;

Collection<CustomObject> list = new ArrayList<CustomObject>();

Collections.sort(list, comparing(CustomObject::getId));
//or
list.sort(comparing(CustomObject::getId));

0

정렬 목적으로 Java Custom Class를 사용할 수 있습니다.


-1

다음을 사용할 수도 있습니다.

Collections.sort(list, new Comparator<CustomObject>() {
    public int compare(CustomObject obj1, CustomObject obj2) {
        return obj1.id - obj2.id;
    }
});
System.out.println(list);

-3

명확하게 말하면 Collection.sort (list, compartor)는 아무것도 반환하지 않으므로 이와 같은 list = Collection.sort(list, compartor);오류가 발생합니다 (void는 [list type]로 변환 할 수 없음).Collection.sort(list, compartor)


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