我想覆盖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的键并对它们进行排序。
答案 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中使用它来定义自己的完整逻辑