2013-07-14 27 views
24

Rõ ràng, nó không được ghi chép hoặc tôi đã bỏ lỡ nó.Thứ tự sắp xếp của Collections.sort của Java (danh sách, so sánh) là gì? nhỏ đến lớn hay to nhỏ?

Here 's các liên kết đến các tài liệu hướng dẫn và dưới đây là những văn bản như một hình ảnh:

EDIT (17/5): Tôi nghĩ quá nhiều nhầm lẫn câu hỏi này là một câu hỏi so sánh. Không phải vậy. Bộ so sánh so sánh giữa 2 phần tử. Theo so sánh đó, danh sách được sắp xếp. Làm cách nào? Tăng hoặc giảm?

Tôi sẽ tinh chỉnh/đơn giản hóa câu hỏi hơn nữa: Nếu bộ so sánh quyết định phần tử A nhỏ hơn phần tử B. Trong danh sách được sắp xếp, phần tử A có được đặt ở chỉ số nhỏ hơn phần tử B không?

enter image description here

+2

Nó phụ thuộc vào cách bạn đã viết ' So sánh'? – sanbhat

+0

Bạn đã xem xét API của 'Comparator' chưa? Nó cho phép bạn xác định thứ tự sắp xếp của riêng bạn. –

+0

Vui lòng xem bản chỉnh sửa của tôi từ ngày 15/7. –

Trả lời

22

thứ tự sắp xếp luôn là tăng dần, nơi sánh xác định các mục lớn hơn những người khác.

Từ tài liệu cho Collections.sort(List<T> list, Comparator<? super T> c):

Sắp xếp danh mục quy định theo trình tự gây ra bởi các so sánh cụ thể.

Từ tài liệu cho Comparator.compare(T,T):

So sánh hai đối số của nó cho đơn đặt hàng. Trả lại số nguyên âm, số không hoặc số nguyên dương làm đối số đầu tiên nhỏ hơn, bằng hoặc lớn hơn số nguyên thứ hai.

+2

Tại sao bạn nghĩ danh sách được sắp xếp tăng dần? –

+3

Quan sát. Sau khi gọi phương thức, danh sách được sắp xếp từ nhỏ nhất đến các thành viên lớn nhất, theo định nghĩa được cung cấp bởi bộ so sánh. Trước khi quan sát, tôi đã đoán được thứ tự tăng dần cho song song với phương pháp anh chị em Collections.sort (Danh sách ), trong đó * được * ghi lại một cách rõ ràng theo thứ tự tăng dần. Tài liệu cho phương pháp bạn đang sử dụng sẽ được cải thiện bằng cách đề cập rõ ràng thứ tự tăng dần, giống như anh chị em của nó. –

19

Bạn (hay đúng hơn, so sánh của bạn) quyết định.

  • Nếu Comparator của bạn 's compare(T o1, T o2) trả về một tiêu cực khi o1 là ít hơn o2, bạn nhận được thứ tự tăng dần (demo on ideone).
  • Nếu sốcủa bạn compare(T o1, T o2) trả về âm khi o1 lớn hơn o2, bạn nhận được thứ tự giảm dần (demo on ideone).

Một cách khác để nói điều tương tự sẽ là sort giả định rằng so sánh lệnh cho hai mục truyền vào nó từ nhỏ (o1) để lớn hơn (o2), và tạo ra một tăng dần loại phù hợp với trật tự đó.

+4

Một cách khác để xem xét điều này, nhất quán hơn với hợp đồng Comparator, là Comparator định nghĩa các mục nào nhỏ hơn, bằng hoặc lớn hơn các mục khác. –

+0

Không phải câu thứ hai là 'trả về dương khi o1 nhỏ hơn o2'? Nếu không nó sẽ sắp xếp theo cách tương tự như trong câu đầu tiên. – nif

+0

@nif Bạn nói đúng, tôi nên "đảo ngược" một phần của điều kiện, không phải cả hai. Cảm ơn! – dasblinkenlight

2

Các tài liệu của Comparator.compareTo(o1, o2) phương pháp nói

So sánh hai đối số của nó cho đơn đặt hàng. Trả lại số nguyên âm, số không hoặc số nguyên dương làm đối số đầu tiên nhỏ hơn, bằng đến hoặc lớn hơn số thứ hai.

Vì vậy, nếu bạn muốn sắp xếp từ trật tự tự nhiên, có nghĩa là nhỏ đến lớn, sau đó bạn nên viết thực hiện theo quy định trong tài liệu

public int compareTo(Integer o1, Integer o2) { 
    int v1 = (o1); 
    int v2 = (o2); 
    if(v1 == v2) { 
     return 0; 
    } 
    if(v1 < v2) { 
     return -1; //return negative integer if first argument is less than second 
    } 
    return 1; 
} 

Nếu bạn muốn sắp xếp được theo thứ tự ngược , đó là lớn đến nhỏ

public int compareTo(Integer o1, Integer o2) { 
    int v1 = (o1); 
    int v2 = (o2); 
    if(v1 == v2) { 
     return 0; 
    } 
    if(v1 < v2) { 
     return 1; //do the other way 
    } 
    return -1; 
} 
0

Theo tài liệu tài liệu https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort(java.util.List,%20java.util.Comparator, việc triển khai sắp xếp cho Collections.sort (danh sách, so sánh) được hợp nhấtSort.

Với kết quả được tạo ra bởi mergeSort là tăng dần (https://en.wikipedia.org/wiki/Merge_sort), thứ tự sắp xếp của Collections.sort (danh sách, bộ so sánh) tăng dần.

Tức là nếu bộ so sánh quyết định rằng phần tử A nhỏ hơn phần tử B. Trong danh sách được sắp xếp, phần tử A sẽ được đặt ở chỉ số nhỏ hơn phần tử B.