Java:存储对象的高效数据结构,没有 'logical' 重复项

Java: Efficient data structure to store object with no 'logical' duplicates

假设我有一个名为 City 的 class,它存储了一些关于城市的数据:

public class City {

    String [] states;
    String name;
    double lat, lng;

    //Constructors, getters/setters, etc
}

我想保留一个不重复的城市列表。现在通常它会很容易(使用 HashSet),但我将比较两个在技术上不同的对象(不同的内存地址)但具有相同的 String 和 double 值。我希望我的 HashSet 将具有相同内部值的对象视为 'equivalent'.

我似乎不知道该怎么做。我是否重写 hashCode() 方法?或者我可能重写了 equals() 方法?

像下面这样的东西行得通吗?

public int hashCode() {
    return (double) name.hashCode() + lat * 100 + lng;
}

只需使用 Set 并为您的 class City 两种方法重新定义:

请记住,重新定义 equals 和 hashcode 始终是一个好习惯,如果不在 HashSetHashMap 等数据结构中出现奇怪的行为,就不可能只重新定义其中一个。

注意:Set是正确的数据结构,因为定义:

A collection that contains no duplicate elements. More formally, sets contain no pair of elements e1 and e2 such that e1.equals(e2), and at most one null element. As implied by its name, this interface models the mathematical set abstraction.

您应该只覆盖 equalshashCode,同时比较 Stringdouble 值在 equals 中的实际值,并基于您的哈希在你的 hashCode 方法中。

在您显示的实现中,散列可能很弱 - 您可能想使用主要种子。

按照建议实施后,equalshashCode 将比较您的对象并根据其成员的值将它们放入存储桶中,这正是您通常想要的。

如果您使用 IDE(推荐),您可以让 IDE 为您起草这些方法。