Java – the correct hashcode is required when comparing an object with an unordered integer pair as a variable
•
Java
I'm in class
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;
}
}
I want to compare two objects. When they have the same building ID, they are the same
So they need to be equal in the following two directions:
BuildingPair(1,2) vs BuildingPair(2,1) BuildingPair(1,2) vs BuildingPair(1,2) BuildingPair(2,1) vs BuildingPair(1,2)
I think the equals method is OK, but hashcode is wrong
Solution
Whether through a, B or B, a, you need to calculate something with the same result There may be more subtle solutions, but I may choose:
@Override
public int hashCode() {
return mBA * mBB;
}
Or anything else that uses commutative operators
Alternatively, you can change the constructor so that it always stores min (a, b) in M (m, b) and max (a, b) in MBB – then you can simplify the comparison code and keep the current hash code
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码
