Java - Делает объектный набор дружественным

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

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

Спасибо!

8
задан Chris Dutrow 2 June 2010 в 23:44
поделиться

4 ответа

Вы должны переопределить 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.
11
ответ дан 5 December 2019 в 05:25
поделиться

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

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

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

3
ответ дан 5 December 2019 в 05:25
поделиться

Вы должны реализовать 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);
    }
}
12
ответ дан 5 December 2019 в 05:25
поделиться

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

5
ответ дан 5 December 2019 в 05:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: