为什么我的树状图排序不正确? import java.util.TreeMap; 类点实现了可比较的{ 私有整数x,y; 公共点(整数x,整数y){ 这个.x=x; 这个。y=y; } @凌驾 公共布尔等于(对象arg0){ 点p=(点)arg0; 返回(this.x==p.x&&this.y==p.y); } @凌驾 公共字符串toString(){ 返回“(“+x+”、“+y+”)”; } @凌驾 公共整数比较(点arg0){ if(this.x==arg0.x&&this.y==arg0.y) 返回0; 返回-1; } } 公开课考试{ 静态int行,col; 静态树映射区; 公共静态void main(字符串[]args){ dist=新树映射(); 行=4; col=7; 对于(int i=0;i

为什么我的树状图排序不正确? import java.util.TreeMap; 类点实现了可比较的{ 私有整数x,y; 公共点(整数x,整数y){ 这个.x=x; 这个。y=y; } @凌驾 公共布尔等于(对象arg0){ 点p=(点)arg0; 返回(this.x==p.x&&this.y==p.y); } @凌驾 公共字符串toString(){ 返回“(“+x+”、“+y+”)”; } @凌驾 公共整数比较(点arg0){ if(this.x==arg0.x&&this.y==arg0.y) 返回0; 返回-1; } } 公开课考试{ 静态int行,col; 静态树映射区; 公共静态void main(字符串[]args){ dist=新树映射(); 行=4; col=7; 对于(int i=0;i,java,treemap,Java,Treemap,而言,您的compareTo不是传递的反对称。有关更多详细信息,请参阅 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 equa

而言,您的
compareTo
不是传递的反对称。有关更多详细信息,请参阅

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)));
        }
    }
}

a!=b
时,
a.compareTo(b)
返回-1,但
b.compareTo(a)
也返回-1。这会导致不正确的排序。

正如@RobAu指出的,问题在于您的方法。请注意该方法的文档:

将负整数、零或正整数作为此对象返回 小于、等于或大于指定对象

您需要修改代码以允许在点之间进行适当的比较,也就是说,您必须为点提供一些排序。例如,下面是一个可行的替代实现:

@覆盖
公共整数比较(点arg0){
int ret=Integer.compare(x,arg0.x);
如果(ret==0){
ret=Integer.compare(y,arg0.y);
}
返回ret;
}

你试过调试吗?你的compare方法总是返回0或-1。这是否符合
Compariable文档中的期望值。compare
?它应该返回所有3个值1,0,-1吗?@Prince是的,没错。@Prince不必担心——但我认为给用户
RobAu
评分会更公平,他的答案是正确的(在我之前)我刚刚添加了引用和代码示例。
@Override
public int compareTo(Point arg0) {
    if(this.x == arg0.x && this.y == arg0.y)
        return 0;
    return -1;
}