在我的Java程序中,类GraphPoint
使用两个坐标 m 和 n 来描述组合结构的点,这两个坐标是唯一的变量。我想创建一组无序的点:
Set<GraphPoint> collection = new HashSet<>();
现在我想知道collection
是否包含给定坐标的点。什么是最快的编码方式?
答案 0 :(得分:2)
如果GraphPoint
类正确实现hashCode
和equals
,则使用contains
方法:
collection.contains(new GraphPoint(m,n))
在返回true之前,JavaDoc for the HashSet contains() method将使用equals
方法测试相等性。具体做法是:
如果此set包含指定的元素,则返回true。更正式地,当且仅当此集合包含元素e时才返回true(o == null?e == null:o.equals(e))。
为了完整起见,并假设您的GraphPoint
类的行为与Point
完全相同,您可以按如下方式实施hashCode
和equals
:
@Override
public int hashCode() {
int result = m;
result = 31 * result + n;
return result;
}
@Override
public boolean equals(Object other){
if (this == other) return true;
if (!(other instanceof GraphPoint)) return false;
final GraphPoint that = (GraphPoint) other;
return this.m == that.m && this.n == that.n;
}
推荐阅读:Effective Java: Equals and HashCode
另外,感谢@Federico_Peralta_Schaffner和@shmosel对我之前回答的反馈