我有一个定义节点的类(一个有三个双坐标的点).
public class Node { private final double x,y,z; public Node() { } public Node(final double x,final double y,final double z) { this.x = x; this.y = y; this.z = z; } public void setCoordinates(final double x,final double z) { this.x = x; this.y = y; this.z = z; } }
我需要创建很多节点并给它们整数ID,但我必须避免重复.
创建节点的方法如下所示:
private Node vertex = new Node(0,0); private final AtomicInteger nodeCounter = new AtomicInteger(); private final Map<Node,Integer> nodeList = new HashMap<>(); public int addNode(final double x,final double z) { vertex.setCoordinates(x,z); int nodeId; if(nodeList.get(vertex) == null) { nodeId = nodeCounter.incrementAndGet(); nodeList.put(new Node(x,z),nodeId); } else { nodeId = nodeList.get(vertex); } return nodeId; }
当然,这不起作用,因为HashMap的getfunction总是返回null.
所以我想我需要覆盖Node类中的hashCode方法.
解决方法
So I guess I need to override the
hashCode
method in the Node class.
这只是交易的一部分.您还需要覆盖equals,以使您的类作为哈希映射的键工作:
@Override public int hashCode() { return 31*31*Double.valueOf(x).hashCode() + 31*Double.valueOf(y).hashCode() + Double.valueOf(z).hashCode(); } @Override public boolean equals(Object other) { if (!(other instanceof Node)) { return false; } Node n = (Node)other; return x == n.x && y == n.y && z == n.z; }
在Java 8中,Double.valueOf(x).hashCode()应替换为Double.hashCode(x)以避免不必要的装箱:
@Override public int hashCode() { return 31*31*Double.hashCode(x) + 31*Double.hashCode(y) + Double.hashCode(z); }
Do I also have to override the
equals
function? Or is thehashCode
function enough?
是的,您必须始终使用hashCode(why?)覆盖equals
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。