java - 如何使用 Comparable 对对象的优先级列表进行排序?

标签 java comparable

这是我的对象类。这里没有错误。

public class AStarNode implements Comparable<AStarNode> {
    AStarNode pathParent;
    int x;
    int y;
    int costFromStart;
    int estimatedCostToGoal;

    public int getCost() {
        return costFromStart + estimatedCostToGoal;
    }

    @Override
    public int compareTo(AStarNode node) {
        int otherValue = node.getCost();
        int thisValue = this.getCost();
        if(thisValue-otherValue > 0) {
            return 1;
        }
        else {
            return 0;
        }
    }
}

这是我的 AStarSearch 类(class)中的一些内容。我在这里遇到错误,但我不知道如何修复它们。过去一个小时我一直在尝试一些东西。我想做的是为 PriorityList 提供一种特殊的方法,该方法根据对象变量之一将对象添加到 PriorityList 中的某个位置。谁能指出我哪里出错了?

public class PriorityList extends LinkedList {
    public void add(Comparable node) {
        for (int i=0; i<size(); i++) {
            if(node.compareTo(node) == 0) {
                add(i, node);
                return; 
            }
        }
        addLast(node);
    }
}

最佳答案

您的实现违反了 Comparable 的契约(Contract)。

假设 A 的值为 2,B 的值为 1。

如果比较 A 和 B,则会得到 2 - 1 > 0,因此会返回 1,这意味着 A 大于 B。

如果将 B 与 A 进行比较,则会得到 1 - 2 < 0,因此将返回 0,这意味着 A 等于 B。

鉴于此错误,任何依赖比较器的算法都将导致不确定的行为。

关于java - 如何使用 Comparable 对对象的优先级列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26535541/

相关文章:

java - Selenium WebDriver Java Firefox Headless 不工作

java - exec,文件位置问题

java - Weka 在 Eclipse 中连接 MySQL

java - Comparable接口(interface)的泛化

java - 从扩展类中覆盖 compareTo - 发生了什么?

java - 使用 processbuilder 从 Java 调用 cmd 命令

java - ArrayList、static 和 this 在 Java 中如何工作?

java - 如何为任何类型的可比较对象实现compareTo

Java 类可比较不起作用

java - Ajax调用数据不绑定(bind)