import java.util.TreeMap;
class Point implements Comparable<Point>{
private int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object arg0) {
Point p = (Point) arg0;
return (this.x == p.x && this.y == p.y);
}
@Override
public String toString() {
return "("+x+", "+y+")";
}
@Override
public int compareTo(Point arg0) {
if(this.x == arg0.x && this.y == arg0.y)
return 0;
return -1;
}
}
public class Test {
static int row, col;
static TreeMap<Point, Integer> dist;
public static void main(String[] args) {
dist = new TreeMap<>();
row = 4;
col = 7;
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
Point p = new Point(i, j);
dist.put(p, Integer.MAX_VALUE);
}
if(i >= 1)
System.out.println(i+": "+dist.keySet().contains(new Point(1, 5)));
}
}
}
输出应为: 1:是的 2:是的 3:真的
但即将到来 1:是的 2:错误 3:假
有人可以解释为什么这个输出会来吗? 如果我采用预定义的数据类型,此代码工作正常 作为地图的关键。 有人可以解释为什么这个输出会来吗? 如果我采用预定义的数据类型,这段代码工作正常
是地图的关键。
答案 0 :(得分:2)
您的compareTo
不是传递反对称。有关详细信息,请参阅http://csharppad.com/gist/5a39f78b1878738fa0181495bb6e3f6e。
@Override
public int compareTo(Point arg0) {
if(this.x == arg0.x && this.y == arg0.y)
return 0;
return -1;
}
当a!=b
时,a.compareTo(b)
返回-1,但b.compareTo(a)
也返回-1。这会导致错误的排序。
答案 1 :(得分:2)
正如@RobAu指出的那样,问题是你的compareTo
方法。请注意该方法的文档:
返回负整数,零或正整数作为此对象 小于,等于或大于指定的对象。
您需要修改代码以便在点之间进行正确比较,也就是说,您必须为点提供一些排序。例如,这是一个有效的替代实现:
@Override
public int compareTo(Point arg0) {
int ret = Integer.compare(x, arg0.x);
if (ret == 0) {
ret = Integer.compare(y, arg0.y);
}
return ret;
}