2010-06-02 8 views
7

Nếu một đối tượng có khóa chính duy nhất, giao diện nào cần thực hiện để thu thập thân thiện, đặc biệt về mặt phân loại hiệu quả, có thể bẻ khóa, v.v ...?Java - Tạo một bộ sưu tập đối tượng thân thiện

Nếu khóa chính là một chuỗi, các giao diện này được triển khai tốt nhất như thế nào?

Cảm ơn!

Trả lời

9

Bạn phải ghi đè Object.equals()Object.hashCode() và cũng triển khai giao diện Comparable. Điều này sẽ làm cho lớp của bạn hoàn toàn "tuân thủ" khi thực hiện bất kỳ loại phân loại hoặc băm nào, kể cả sử dụng Collections.sort(), bất kỳ lớp nào Map hoặc bất kỳ lớp nào Set. Nếu thậm chí có một cơ hội nhỏ rằng lớp học sẽ được đặt trong một số loại bộ sưu tập, thì cần chắc chắn triển khai cả ba phương pháp này.

public class A implements Comparable<A>{ 
    private String key; 

    @Override 
    public boolean equals(Object obj){ 
     if (this == obj) return true; 
     if (!(obj instanceof A)) return false; 

     A that = (A)obj; 
     return this.key.equals(that.key);  
    } 

    @Override 
    public int hashCode(){ 
     return key.hashCode(); 
    } 

    @Override 
    public int compareTo(A that){ 
     //returns -1 if "this" object is less than "that" object 
     //returns 0 if they are equal 
     //returns 1 if "this" object is greater than "that" object 
     return this.key.compareTo(that.key); 
    } 
} 

Hãy ghi nhớ rằng nếu hai đối tượng đều bình đẳng, sau đó:

  1. mã băm của họ cũng phải bằng và
  2. compareTo() phải trở về 0.
12

Bạn phải triển khai equals, hashCode và (sau khi triển khai giao diện Comparable) compareTo.

Trong mỗi trường hợp, vì bạn có một chuỗi là khóa chính, bạn có thể xem xét đơn giản là gửi các cuộc gọi này đến chuỗi của bạn. Ví dụ:

public class Friendly implements Comparable<Friendly> 
{ 
    // presumably you've got other fields as well 
    private String primaryKey; 
    public Friendly(String primaryKey) 
    { 
     this.primaryKey = primaryKey; 
    } 

    public int compareTo(Friendly other) 
    { 
     return primaryKey.compareTo(other.primaryKey); 
    } 

    public int hashCode() 
    { 
     return primaryKey.hashCode(); 
    } 

    public boolean equals(Object o) 
    { 
     return (o instanceof Friendly) && primaryKey.equals(((Friendly)o).primaryKey); 
    } 
} 
+3

Và chắc chắn rằng compareTo tuân theo hợp đồng "bằng". – duffymo

+2

Và các đối tượng bằng nhau có mã băm bằng nhau. – CurtainDog

5

Strings đã rất rất thích hợp cho băm và so sánh, vì vậy nếu đối tượng của bạn thực sự có thể được xác định duy nhất bởi chuỗi sau đó bạn đang ở trong tình trạng tốt. Chỉ cần đảm bảo triển khai giao diện Comparable để sắp xếp và ghi đè equalshashCode (ủy quyền chuỗi khóa chính) cho băm và bạn sẵn sàng sử dụng.

3

Nếu khóa chính là Object, bạn cần quyết định xem thứ tự sắp xếp có dựa trên số Object hoặc Object của khóa chính Object hay không.

Trong cả hai trường hợp, mục cần sắp xếp sẽ triển khai giao diện Comparable, với phương thức thích hợp compareTo(). Tỷ lệ cược tuyệt vời có nghĩa là bạn cũng sẽ phải ghi đè lên equals()hashCode() vì chỉ một số đối tượng khóa chính có khả năng có triển khai mặc định phù hợp.

Nếu bạn muốn sắp xếp dựa trên một số thứ tự sắp xếp không tự nhiên, sau đó cũng triển khai một vài "phụ" Comparators. Đã đặt hàng Collections hỗ trợ thay thế Comparators.