为什么我的 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!=b
,a.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;
}
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!=b
,a.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;
}