2017-04-12 47 views
-2
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:真正的为什么我的TreeMap没有正确排序?

但其未来 1:真 2:假 3:假

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

作为地图的关键。

+2

您尝试调试吗? –

+0

您的比较方法* always *返回0或-1。这符合Comparable.compare文档中的期望吗? –

+0

应该返回所有3个值1,0,-1? – Prince

回答

2

您的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)返回-1,但b.compareTo(a)也返回-1。这会导致排序错误。

+0

好的......谢谢 – Prince

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; 
} 
+0

感谢大家的回应...... – Prince

+0

@Pince无忧 - 但我认为给用户RobAu信用会更公平,他的回答是正确的(在我之前)我只是添加了报价和代码示例。 – Thomas

相关问题