Если объект удерживает уникальную первичную клавишу, какие интерфейсы он должен реализовать, чтобы быть набор, дружественный особенно с точки зрения того, чтобы быть эффективно поддающимся сортировке, hashable, и т.д....?
Если первичный ключ является строкой, как эти интерфейсы лучше всего реализованы?
Спасибо!
Вы должны переопределить 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);
}
}
Имейте в виду, что если два объекта равны, то:
compareTo ()
должен возвращать 0. Если первичным ключом является объект
, вам необходимо решить, основан ли порядок сортировки на объекте
или на первичном ключе объекта
] Объект
.
В любом случае сортируемый элемент должен реализовывать интерфейс Comparable
с надлежащим методом compareTo ()
. Шансы отличные, это означает, что вам придется переопределить equals ()
и hashCode ()
, так как только некоторые из объектов первичного ключа, вероятно, будут иметь правильные реализации по умолчанию.
Если вы хотите выполнить сортировку на основе неестественного порядка сортировки, также используйте несколько «дополнительных» компараторов
. Упорядоченные коллекции
поддерживают альтернативные компараторы
.
Вы должны реализовать 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);
}
}
Строки уже очень хорошо подходят для хэширования и сравнения, так что если ваши объекты действительно могут быть уникально идентифицированы строками, то вы в хорошей форме. Просто убедитесь, что реализовали интерфейс Comparable
для сортировки и переопределили equals
и hashCode
(делегируя первичным ключом строку) для хэширования, и все в порядке.