如何覆盖compareTo方法?

时间:2019-08-04 06:47:53

标签: java comparable

我想覆盖compareTo方法。我努力地搜索了一下,但是找不到任何有用的东西,因为我的K没有特别定义(它不像名称(年龄)的People(类示例)。

我有无法编辑的Node.java文件。


public class Node<K extends Comparable<K>, V>
{
    public K key;
    public V value;

    public Node<K, V> parent;
    public Node<K, V> left;
    public Node<K, V> right;

    public Node(K key, V value, Node<K, V> parent, Node<K, V> left, Node<K, V> right)
    {
        this.key = key;
        this.value = value;

        this.parent = parent;
        this.left = left;
        this.right = right;
    }
}

,我还有另一个文件Heap.java

public class Heap<K extends Comparable<K>, V> {...}

我想在Heap.java(这里{..}内)重写compareTo方法,以便我可以比较Node的键并对它们进行排序。

3 个答案:

答案 0 :(得分:2)

您可以像这样创建compareTo,而不是覆盖Comparator<Node>

Comparator<Node<K extends Comparable<K>>, V> comparator =
        Comparator.comparing(node -> node.key);

您可以使用它在大多数库方法中进行排序,例如,在对地图进行排序的情况下,可以通过Comparator。

但是请注意,拥有一个公共密钥字段是一个坏主意。它本身就够糟糕的了,但是如果用它来存储它甚至更糟,因为当其他人更改字段时,您会搞砸。

答案 1 :(得分:0)

如果您希望将对象用作自然排序键,则可以在该对象上使用可比对象,即堆工具Comparable将使您覆盖它,然后可以在节点中使用堆对象。而且,如果您希望堆对象对可比较对象进行排序,最好的方法是查看Collections类中的实现。

答案 2 :(得分:0)

如果您可以在与compareTo相对应的类中提供K,则可以按如下方式创建比较器:

Comparator<Node<K, V>> comparator = new Comparator<Node<K, V>>() {
    @Override
    public int compare(Node<K, V> node1, Node<K, V> node2) {
        return node1.key.compareTo(node2.key);
    }
};

您可以在任何地方使用此比较器,例如对节点列表进行排序,只需执行Collections.sort(nodes, comparator)

您还可以将K绑定到一个接口,该接口为您提供获取键值的方法,并在Heap.java中使用它来定义自己的完整逻辑