ArrayList <Long>을 내림차순으로 정렬하는 방법은 무엇입니까?


98

ArrayList<Long>Java에서 내림차순 으로 정렬하는 방법은 무엇입니까?

답변:


240

다음은 한 가지 방법입니다 list.

list.sort(null);
Collections.reverse(list);

또는 직접 구현하여 Comparator반대 단계를 정렬하고 제거 할 수 있습니다 .

list.sort((o1, o2) -> o2.compareTo(o1));

또는 Collections.reverseOrder()후진 중이므로 더 간단하게 사용하십시오 .

list.sort(Collections.reverseOrder());

6
l1 > l2 ? -1 : l1 == l2 ? 0 : 1이 코드는 말도 안됩니다. o1.compareTo(o2)그때 사용하십시오 .
ilalex 2011

4
@ilya : 오 예, 좋은 지적입니다. o2.compareTo(o1)여기에 있어야하지만 :)
WhiteFang34

2
list.sort (Collections.reverseOrder ());
tunix

대한 엄지 손가락이list.sort((o1, o2) -> o2.compareTo(o1))
arenaq

27
Comparator<Long> comparator = Collections.reverseOrder();
Collections.sort(arrayList, comparator);

해당 변수 선언에 대한 제네릭 인수 만 사용합니다.
Tom Hawtin-tackline

18

아래에 주어진 다음 코드를 사용할 수 있습니다.

Collections.sort(list, Collections.reverseOrder());

또는 사용자 정의 비교기를 사용하려는 경우 아래와 같이 사용할 수 있습니다.

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

CustomComparator는 목록에있는 개체를 비교하는 비교기 클래스입니다.


10

자바 8

Java 8에서 잘하는 것은 훨씬 재미 있고 쉽습니다.

Collections.sort(variants,(a,b)->a.compareTo(b));
Collections.reverse(variants);

람다 표현이 여기에 락!

ab 를 비교 하기 위해 둘 이상의 라인 로직이 필요한 경우 다음 과 같이 작성할 수 있습니다.

Collections.sort(variants,(a,b)->{
    int result = a.compareTo(b);
    return result;
});

1
이것을 b.compareTo (a)로 변경하면 컬렉션을 되돌릴 필요가 없습니다.
zawhtut

@zawhtut, 완전히 사실입니다! 단지 역 ()는 옵션을 알 수 있도록, 선택은 당신입니다 언급
azerafati

long을 Long으로 변환해야합니까?
BluE


3

긴 값이 객체 어딘가에있는 람다의 경우 다음을 사용하는 것이 좋습니다.

.sorted((o1, o2) -> Long.compare(o1.getLong(), o2.getLong()))

또는 더 나은 :

.sorted(Comparator.comparingLong(MyObject::getLong))


2

아래와 같이 자체 Comparator를 구현하는보다 일반적인 접근 방식

Collections.sort(lst,new Comparator<Long>(){
                public int compare(Long o1, Long o2) {
                    return o2.compareTo(o1);
                }
            });


1

다음 접근 방식은 목록을 내림차순으로 정렬하고 ' null '값 도 처리합니다. null 값이있는 경우 Collections.sort ()에서 NullPointerException 을 throw합니다.

      Collections.sort(list, new Comparator<Long>() {
          public int compare(Long o1, Long o2) {
                  return o1==null?Integer.MAX_VALUE:o2==null?Integer.MIN_VALUE:o2.compareTo(o1);

        }
    });

0

당신은 또한을 정렬 할 수 있습니다 ArrayListTreeSet대신의 comparator. 다음은 정수 배열에 대한 이전 질문의 예입니다. 나는 "숫자"를 ArrayList.


     import.java.util.*;
        class MyClass{
        public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        ArrayList<Integer> numbers = new ArrayList<Integer>(); 

        TreeSet<Integer> ts = new TreeSet<Integer>(numbers);
        numbers = new ArrayList<Integer>(ts);
        System.out.println("\nThe numbers in ascending order are:");
        for(int i=0; i<numbers.size(); i++)
        System.out.print(numbers.get(i).intValue()+" ");
        System.out.println("\nThe numbers in descending order are:");
        for(int i=numbers.size()-1; i>=0; i--)
        System.out.print(numbers.get(i).intValue()+" ");
    }
}

그러나 TreeSet중복 값을 저장하지 않습니다.

0

그래서 제가 중요하다고 생각하는 것이 있는데, 여러분이 고려해야 할 것이 있다고 생각합니다. 런타임 및 메모리. 목록이 있고 정렬하고 싶다고 가정 해 보겠습니다. 기본 정렬이 있거나 직접 개발할 수 있습니다. 그런 다음 목록을 뒤집고 싶다고 말합니다. 그것이 위에 나열된 대답입니다.

그래도 목록을 만드는 경우 다른 데이터 구조를 사용하여 저장 한 다음 배열에 덤프하는 것이 좋습니다.

힙은이 작업을 수행합니다. 데이터를 필터링하면 모든 것을 처리 할 수 ​​있으며 개체에서 모든 것을 꺼내 정렬 할 수 있습니다.

또 다른 옵션은지도가 작동하는 방식을 이해하는 것입니다. 많은 경우에 Map 또는 HashMap은 무엇이라고 불리는 것으로 그 뒤에 기본 개념이 있습니다.

예를 들어 .... 키가 긴 키-값 쌍을 입력하고 모든 요소를 ​​추가하면 다음을 수행 할 수 있습니다. .keys그러면 자동으로 정렬 된 목록이 반환됩니다.

정렬 및 후속 반전을 계속해야한다고 생각하는 방법에 앞서 데이터를 처리하는 방법에 따라 다릅니다.


0

비교기의 비교 방법을 사용하여 객체를 비교 한 다음 방법 reversed()을 적용하여 순서를 반대로 할 수 있습니다.

list.stream().sorted(Comparator.comparing(Employee::getName).reversed()).collect(toList());
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.