Java 컬렉션 정렬


78

Java 컬렉션이 있습니다.

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

CustomObject이 id필드는 현재 표시 목록 전에 그하여이 컬렉션을 정렬 할 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.