Java - сделать коллекцию объектов дружественной - PullRequest
8 голосов
/ 03 июня 2010

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

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

Спасибо!

Ответы [ 4 ]

12 голосов
/ 03 июня 2010

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

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

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);
    }
}
11 голосов
/ 03 июня 2010

Вы должны переопределить 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.
5 голосов
/ 03 июня 2010

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

3 голосов
/ 03 июня 2010

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

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

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

...