Làm thế nào để sắp xếp ArrayList <Long> theo thứ tự giảm dần?


98

Làm thế nào để sắp xếp một ArrayList<Long>trong Java theo thứ tự giảm dần?

Câu trả lời:


240

Đây là một cách cho bạn list:

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

Hoặc bạn có thể triển khai của riêng bạn Comparatorđể sắp xếp và loại bỏ bước ngược lại:

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

Hoặc thậm chí sử dụng đơn giản hơn Collections.reverseOrder()vì bạn chỉ đang đảo ngược:

list.sort(Collections.reverseOrder());

6
l1 > l2 ? -1 : l1 == l2 ? 0 : 1mã này là vô lý. Sử dụng o1.compareTo(o2)sau đó.
ilalex

4
@ilya: oh yeah, điểm tốt, mặc dù nó cần phải o2.compareTo(o1)ở đây :)
WhiteFang34

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

Thumbs up cholist.sort((o1, o2) -> o2.compareTo(o1))
arenaq

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

Chỉ với một đối số generics trên khai báo biến đó.
Tom Hawtin - tackline

18

Bạn có thể sử dụng mã sau được cung cấp bên dưới;

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

hoặc nếu bạn định sử dụng bộ so sánh tùy chỉnh, bạn có thể sử dụng như nó được đưa ra bên dưới

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

Trong đó CustomComparator là một lớp so sánh so sánh đối tượng có trong danh sách.


10

Java 8

làm tốt điều này trong java 8 thật thú vị và dễ dàng hơn

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

Lambda biểu thức rock đây !!!

trong trường hợp bạn cần một logic nhiều hơn một dòng để so sánh ab, bạn có thể viết nó như thế này

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

1
Tôi nghĩ nếu chúng ta thay đổi điều này thành b.compareTo (a), chúng ta sẽ không cần phải đảo ngược bộ sưu tập.
zawhtut

@zawhtut, hoàn toàn đúng! chỉ đề cập ngược () để bạn biết các tùy chọn, sự lựa chọn là của bạn
azerafati

Bạn có phải chuyển đổi từ lâu sang Long không?
BluE


3

Đối với lamdas trong đó giá trị dài của bạn nằm ở đâu đó trong một đối tượng, tôi khuyên bạn nên sử dụng:

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

hoặc thậm chí tốt hơn:

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


2

Một cách tiếp cận tổng quát hơn để triển khai Bộ so sánh của riêng chúng tôi như bên dưới

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


1

Cách tiếp cận sau đây sẽ sắp xếp danh sách theo thứ tự giảm dần và cũng xử lý các giá trị ' null ', đề phòng trường hợp bạn có bất kỳ giá trị null nào thì Collections.sort () sẽ ném NullPointerException

      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

Bạn cũng có thể sắp xếp một ArrayListvới một TreeSetthay vì a comparator. Đây là một ví dụ từ một câu hỏi tôi đã có trước đây cho một mảng số nguyên. Tôi đang sử dụng "số" làm tên trình giữ chỗ cho 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()+" ");
    }
}

Nhưng TreeSetkhông lưu trữ các giá trị trùng lặp.

0

Vì vậy, có một điều tôi muốn đưa ra mà tôi nghĩ là quan trọng và tôi nghĩ rằng bạn nên xem xét. thời gian chạy và bộ nhớ. Giả sử bạn có một danh sách và muốn sắp xếp nó, bạn có thể, có một danh sách được xây dựng sẵn hoặc bạn có thể phát triển danh sách của riêng mình. Sau đó, bạn nói, muốn đảo ngược danh sách. Đó là câu trả lời được liệt kê ở trên.

Tuy nhiên, nếu bạn đang tạo danh sách đó, có thể tốt nếu sử dụng một cấu trúc dữ liệu khác để lưu trữ nó và sau đó chỉ cần kết xuất nó vào một mảng.

Hàng đống chỉ làm điều này. Bạn lọc dữ liệu và nó sẽ xử lý mọi thứ, sau đó bạn có thể tách mọi thứ ra khỏi đối tượng và nó sẽ được sắp xếp.

Một lựa chọn khác là hiểu cách hoạt động của bản đồ. Rất nhiều lần, Bản đồ hoặc HashMap như một thứ được gọi là một thứ gì đó được gọi, có một khái niệm cơ bản đằng sau nó.

Ví dụ .... bạn cung cấp một loạt các cặp khóa-giá trị trong đó khóa là dài và khi bạn thêm tất cả các phần tử, bạn có thể thực hiện: .keysvà nó sẽ tự động trả lại cho bạn một danh sách đã được sắp xếp.

Nó phụ thuộc vào cách bạn xử lý dữ liệu trước đó như cách tôi nghĩ bạn nên tiếp tục với việc sắp xếp và đảo ngược tiếp theo


0

Phương pháp so sánh của bộ so sánh có thể được sử dụng để so sánh các đối tượng và sau đó phương pháp này reversed()có thể được áp dụng để đảo ngược thứ tự -

list.stream().sorted(Comparator.comparing(Employee::getName).reversed()).collect(toList());
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.