为什么我的 TreeMap 排序不正确?

Why is is my TreeMap not sorted correctly?

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: 假

有人能解释一下为什么会出现这个输出吗? 如果我使用预定义的数据类型,这段代码工作正常 作为地图的关键。 有人可以解释为什么会出现这个输出吗? 如果我使用预定义的数据类型,这段代码工作正常

作为地图的关键。

你的compareTo不是传递反对称的。有关详细信息,请参阅 here

@Override
public int compareTo(Point arg0) {
    if(this.x == arg0.x && this.y == arg0.y)
        return 0;
    return -1;
}

a!=ba.compareTo(b) returns -1,但b.compareTo(a)也returns -1。这会导致排序不正确。

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

Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.

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

@Override
public int compareTo(Point arg0) {
    int ret = Integer.compare(x, arg0.x);
    if (ret == 0) {
        ret = Integer.compare(y, arg0.y);
    }
    return ret;
}