java – 将Object与无序整数对作为变量进行比较时需要正确的hash
发布时间:2020-12-15 04:58:25 所属栏目:Java 来源:网络整理
导读:我上课了 final class BuildingPair { int mBA; int mBB; public BuildingPair(int pBuildingA,int pBuildingB) { mBA = pBuildingA; mBB = pBuildingB; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * resul
我上课了
final class BuildingPair { int mBA; int mBB; public BuildingPair(int pBuildingA,int pBuildingB) { mBA = pBuildingA; mBB = pBuildingB; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + mBA; result = prime * result + mBB; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; BuildingPair other = (BuildingPair) obj; if ((mBA==other.mBA&&mBB==other.mBB)||(mBA==other.mBB&&mBB==other.mBA)) return true; return false; } } 我想比较两个对象,当它们具有相同的建筑物ID时,它们是相同的 所以他们需要在以下两个方向上保持平等: BuildingPair(1,2) vs BuildingPair(2,1) BuildingPair(1,2) vs BuildingPair(1,2) BuildingPair(2,1) vs BuildingPair(1,2) 我认为equals方法没问题,但是hashcode是错误的. 解决方法
无论是通过A,B还是B,A,你都需要计算相同结果的东西.可能会有更微妙的解决方案,但我可能会选择:
@Override public int hashCode() { return mBA * mBB; } 或者使用可交换运算符的任何其他东西. 或者,您可以更改构造函数,使其始终将m(m,b)中的min(a,b)和mBB中的max(a,b)存储起来 – 然后可以简化比较代码并保留当前的哈希代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |