2010-12-13 37 views
18

Tôi có một lớp, tôi sắp xếp nó theo một thuộc tính. Bây giờ tôi cần phải thực hiện một điều khác, rằng tôi cần tạo một cách khác để sắp xếp dữ liệu của mình. Làm thế nào tôi có thể làm cho nó, vì vậy tôi có thể lựa chọn giữa hai phương pháp. Lệnh duy nhất tôi biết là Collections.sort sẽ chọn phương thức compareTo từ lớp tôi muốn so sánh dữ liệu của nó.Làm cách nào để tạo 2 phương pháp so sánh chỉ trong một lớp?

Thậm chí có thể không?

+0

Nếu nó có thể sử dụng các từ rõ ràng hơn thay cho "điều" và "cách", sau đó đưa ra câu trả lời hay sẽ dễ dàng hơn. Vì nó là viết tắt, tôi phải tôn trọng thừa nhận tôi đấu tranh để hiểu được câu hỏi chính xác. –

Trả lời

49

Những gì bạn cần làm là triển khai Comparator tùy chỉnh. Và sau đó sử dụng:

Collections.sort(yourList, new CustomComparator<YourClass>()); 

Cụ thể, bạn có thể viết: (Điều này sẽ tạo ra một lớp Anonymous mà thực hiện Comparator.)

Collections.sort(yourList, new Comparator<YourClass>(){ 
    public int compare(YourClass one, YourClass two) { 
     // compare using whichever properties of ListType you need 
    } 
}); 

Bạn có thể xây dựng những thành lớp học của bạn nếu bạn thích:

class YourClass { 

    static Comparator<YourClass> getAttribute1Comparator() { 
     return new Comparator<YourClass>() { 
      // compare using attribute 1 
     }; 
    } 

    static Comparator<YourClass> getAttribute2Comparator() { 
     return new Comparator<YourClass>() { 
      // compare using attribute 2 
     }; 
    } 
} 

Nó có thể được sử dụng như vậy:

Collections.sort(yourList, YourClass.getAttribute2Comparator()); 
3

Bạn chỉ có thể có một phương thức compareTo() trong lớp học của mình.

Nếu bạn muốn sắp xếp cùng một lớp theo nhiều cách, hãy tạo Comparator triển khai.

3

Nếu hai phương thức này yêu cầu cùng một dấu chân, bạn có thể quá tải một lớp đơn với nhiều lần sử dụng, điều này sẽ được giải quyết bằng cách sửa hệ thống cấp bậc của bạn - thay vì sử dụng "hình dạng", phân lớp bằng "hình bầu dục", "hình chữ nhật", v.v.

Nếu phân lớp không có ý nghĩa, bạn cần phải tạo các lớp so sánh khác nhau. Trong Java, bạn thường sử dụng một Comparator để so sánh. Tạo nhiều (hoặc tạo ra một so sánh cấu hình): IsbnComparator, AuthorComparator vv

Oh, và các tùy chọn cấu hình sẽ là:

 
BookComparator implements Compartor { 
    enum FIELD { AUTHOR, ISBN, ... }; 
    setSortOrder(int rank, FIELD field){...} 
} 
Các vấn đề liên quan