为什么我的TreeMap没有正确排序?

时间:2017-04-12 06:48:41

标签: java treemap

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

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

是地图的关键。

2 个答案:

答案 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;
}