2010-07-02 39 views
5

Tôi gặp vấn đề về litte và đang tự hỏi cách giải quyết nó. Tôi có một lớp generic Tuple<A,B> và bây giờ tôi muốn sắp xếp các bộ theo A và B. Nó sẽ giống như thế này:Đảm bảo rằng các đối tượng thực hiện Comparable

Unsorted:

 
(1,5) 
(2,8) 
(6,8) 
(1,4) 
(2,4) 

Sắp xếp:

 
(1,4) 
(1,5) 
(2,4) 
(2,8) 
(6,8) 

Đối lý do đó tôi nghĩ đến việc thực hiện một phương pháp so sánh chung (public int compareTo(Tuple<A, B> other)) trong lớp Tuple. Vấn đề duy nhất là tất cả các đối tượng mà bạn có thể tham số hóa lớp (ví dụ A = Integer, B = String) phải thực hiện phương thức compareTo để toàn bộ việc này hoạt động.

Có cách nào để đảm bảo rằng tất cả các đối tượng mà Tuple có thể giữ thực hiện giao diện Có thể so sánh không?

Hoặc có bất kỳ đề xuất nào khác về cách giải quyết vấn đề này không?

Cảm ơn

Trả lời

5

Bạn có thể sử dụng giới hạn loại đệ quy (xem thêm mục 27 của Effective Java) để xác định rằng các thành phần của tuple mở rộng tương đương, như vậy:

public class Tuple<A extends Comparable<? super A>, B extends Comparable<? super A>> implements Comparable<Tuple<A, B>> { 
    A valueA; 
    B valueB; 

    @Override 
    public int compareTo(Tuple<A, B> tuple) { 
     // Implement comparison logic 
     return 0; 
    } 
} 

Điều này cho phép bạn chỉ định các loại khác nhau cho các thành phần của bộ tuple (Tuple < Số nguyên, Chuỗi >).

+0

Tôi thích 'A mở rộng so sánh ', nhưng +1 để triển khai So sánh trên chính Tuple. Tôi nên nhớ điều đó. –

+0

Ah, cảm ơn. Tôi đã chỉnh sửa câu trả lời của tôi để không đánh lừa, và đã upvoted mmyers 'phiên bản. – Lyle

1

Điều này cần thực hiện thủ thuật. Bất kỳ lớp nào bạn chỉ định sẽ phải mở rộng So sánh.

public class Tuple<? extends Comparable> { 
} 
+0

Tôi nhận ra bạn đã viết điều này mà không nhìn thấy bản khai gốc chung của Tuple, vì vậy tôi không thể đổ lỗi cho bạn về việc thiếu tham số A và B. Nhưng ngay cả như vậy, nó sẽ gây ra một cảnh báo bởi vì bạn đã không tham số Comparable. –

7

Nếu bạn khai báo lớp như

public class Tuple<A extends Comparable<? super A>, 
        B extends Comparable<? super B>> { ... 

sau đó đảm bảo rằng cả hai A và B là tự so sánh. Sau đó, bạn có thể gọi compareTo() trên bất kỳ đối tượng nào thuộc loại A hoặc B mà bạn có trong lớp học.

Các vấn đề liên quan