【问题标题】:Java Override CompareTo methodJava 覆盖 CompareTo 方法
【发布时间】:2017-02-06 19:21:29
【问题描述】:

我有 Coordinates 类,我想让 Coordinates 对象具有可比性。

public class Coordinates implements Comparable<Coordinates> {

private int row;
private int column;

这个想法是将 Coordinates 对象插入 PriorityQueue 并对其进行排序。

 @Override
public int compareTo(Coordinates o) {
    if (row < o.row) {
        return row;
    }
    if (row > o.row) {
        return o.row;
    }
    if (row == o.row) {
        if (column < o.column) {
            return column;
        }
        if (column > o.column) {
            return o.column;
        }
    }
//    return 0;
}

这是我的尝试,但我不确定我究竟应该返回什么以及如何返回它。我希望我的最小坐标具有最高优先级。而且我写的函数仍然需要一个返回值——注释行

【问题讨论】:

  • 什么意义上的最小?比如,(1, 2)(2, 1) 相比应该如何?
  • 您可以计算每个对象与(0, 0) 的距离,然后用它来比较。
  • 我希望 0,5 的优先级高于 1,5,而 1,0 的优先级高于 1,3
  • compareTo 应该返回 -1 表示大于,0 表示等于,+1 表示小于。值的负数或正数无关紧要。
  • 我认为@JasonPer 应该告诉我们他真正想在这里做什么......

标签: java coordinates priority-queue comparator


【解决方案1】:

我希望 0,5 的优先级高于 1,5,而 1,0 的优先级高于 1,3

实际上你想要一个反向排序。但是,优先级队列将最低值放在最前面,因此自然顺序使最低值首先出现。

0 表示大于

@Override
public int compareTo(Coordinates o) {
    if (row < o.row) return -1;
    if (row > o.row) return +1;

    if (column < o.column) return -1;
    if (column > o.column) return +1;
    return 0;
}

您可以使用Integer.compare 简化此操作

@Override
public int compareTo(Coordinates o) {
    int cmp = Integer.compare(row, o.row);
    if (cmp == 0)
        cmp = Integer.compare(column, o.column);
    return cmp;
}

注意:如果你假设行和列都是非负的,你可以写

@Override
public int compareTo(Coordinates o) {
    int cmp = row - o.row;
    if (cmp == 0)
        cmp = column - o.column;
    return cmp;
}

【讨论】:

【解决方案2】:
if (row < o.row) {
    return row;
}
else if (row > o.row) {
    return o.row;
}
else
{
    if(row == o.row)
    {

        if (column < o.column) {
            return column;
        }
        if (column > o.column) {
            return o.column;
       }
    }
}

修复 if-else 分支,希望您得到 return missing syntax error

【讨论】:

  • 而我写的函数仍然需要一个返回值——注释行
  • 我的意思是你一定是在开玩笑:)