2010-06-02 2 views
7

Если объект содержит уникальный первичный ключ, какие интерфейсы ему нужно реализовать для того, чтобы быть дружественным к коллекции, особенно с точки зрения того, чтобы быть эффективно сортируемым, хешируемым и т. Д. ...?Java - Сделать коллекцию объектов дружественной

Если первичный ключ является строкой, как лучше всего реализовать эти интерфейсы?

Спасибо!

ответ

9

Вы должны переопределить Object.equals() и Object.hashCode(), а также реализовать интерфейс Comparable. Это сделает ваш класс полностью «совместимым» при любой сортировке или хешировании, включая использование Collections.sort(), любого класса Map или любого класса Set. Если есть даже крошечный шанс, что класс будет помещен в какую-то коллекцию, то он должен определенно реализовать все три из этих методов.

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); 
    } 
} 

Имейте в виду, что если два объекта равны, то:

  1. их хеш-коды должны быть равны и
  2. compareTo() должен возвращать 0.
12

Необходимо выполнить equals, hashCode и (после реализации интерфейса Comparable) compareTo.

В каждом случае, поскольку у вас есть строка, которая является первичным ключом, вы можете просто отправить эти вызовы в свою строку. Например:

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

И убедитесь, что compareTo соответствует контракту «равно». – duffymo

+2

И что равные объекты имеют одинаковые хэш-коды. – CurtainDog

5

Строки уже очень хорошо подходят для хеширования и сравнения, так что, если ваши объекты могут действительно быть однозначно определены строками, то вы находитесь в хорошей форме. Просто убедитесь, что реализовали интерфейс Comparable для сортировки и переопределения equals и hashCode (делегирование первичной ключевой строки) для хэширования, и вам хорошо идти.

3

Если первичный ключ Object, вам необходимо решить, будет ли порядок сортировки основан на Object или Object Первичный ключ Object.

В любом случае предмет, подлежащий сортировке, должен реализовывать интерфейс Comparable, с соответствующим методом compareTo(). Коэффициенты превосходны, что означает, что вам придется переопределить equals() и hashCode(), так как только некоторые из объектов первичного ключа, вероятно, будут иметь правильные реализации по умолчанию.

Если вы хотите отсортировать на основе некорректного порядка сортировки, тогда также реализуйте несколько «лишних» Comparators. Упорядочено Collections поддержка альтернатива Comparators.

Смежные вопросы