作者:安静2502917547 | 来源:互联网 | 2023-02-11 04:33
我有一个Triple类,它是一个可以包含3个整数(x,y,z)的类.我想覆盖equals/hashcode方法,以便它们可以在一个集合中使用.所以带(1,2,3)的obj应该等于(3,2,1)或(3,1,2),所以应该等于它的任何排列.我知道如何使用(x,y)对Pair类执行此操作 - 我对此的对类的代码是:
class Pair {
int x;
int y;
public Pair(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Pair) {
Pair p = (Pair) obj;
if (this.x == p.x && p.y == this.y || this.x == p.y && this.y == p.x) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
return Integer.hashCode(x) * Integer.hashCode(y);
}
}
这工作正常,但如果我想将它扩展为Triple类,我知道我可以编辑equals方法并添加更多条件来检查,但这似乎很长.如果不在Java中使用外部库,我有什么方法可以做到这一点?
1> shmosel..:
一种解决方案是保留一个排序数组以进行比较:
class Triple {
private final int x, y, z;
private final int[] sorted;
public Triple(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
this.sorted = new int[] {x, y, z};
Arrays.sort(sorted);
}
@Override
public boolean equals(Object obj) {
return obj instanceof Triple
&& Arrays.equals(((Triple)obj).sorted, this.sorted);
}
@Override
public int hashCode() {
return Arrays.hashCode(sorted);
}
}
"如果OP要实现setX,setY,setZ方法",那么最好还是不要保持`Triple`不变