Java 如何重写compareTo方法?
我想重写Java 如何重写compareTo方法?,java,comparable,Java,Comparable,我想重写compareTo方法。我努力地在谷歌上搜索,但找不到任何有用的东西,因为我的K没有明确定义(它不像有名字、年龄的人(例如类) 我有无法编辑的Node.java文件 公共类节点 { 公钥; 公共价值观; 公共节点父节点; 公共节点左; 公共节点权; 公共节点(K键、V值、节点父节点、左节点、右节点) { this.key=key; 这个值=值; this.parent=parent; this.left=左; 这个。右=右; } } 我还有另一个文件Heap.java 公共类堆{…}
compareTo
方法。我努力地在谷歌上搜索,但找不到任何有用的东西,因为我的K没有明确定义(它不像有名字、年龄的人(例如类)
我有无法编辑的Node.java文件
公共类节点
{
公钥;
公共价值观;
公共节点父节点;
公共节点左;
公共节点权;
公共节点(K键、V值、节点父节点、左节点、右节点)
{
this.key=key;
这个值=值;
this.parent=parent;
this.left=左;
这个。右=右;
}
}
我还有另一个文件Heap.java
公共类堆{…}
我想覆盖Heap.java中的compareTo方法(在
{..}
中!),这样我就可以比较节点的键并对它们进行排序。而不是覆盖compareTo
,您可以创建一个比较器,如下所示:
Comparator<Node<K extends Comparable<K>>, V> comparator =
Comparator.comparing(node -> node.key);
比较器比较器=
比较器。比较(节点->节点。键);
您可以在大多数库方法中使用它进行排序,例如在排序映射的情况下,您可以传递一个比较器
但是请注意,使用公钥字段是个坏主意。它本身已经够糟糕的了,但是如果你用它来存储,它会变得更糟,因为当其他人改变字段时,你会弄乱空头 您可以像下面这样创建一个
比较器,而不是将比较器重写为:
Comparator<Node<K extends Comparable<K>>, V> comparator =
Comparator.comparing(node -> node.key);
比较器比较器=
比较器。比较(节点->节点。键);
您可以在大多数库方法中使用它进行排序,例如在排序映射的情况下,您可以传递一个比较器
但是请注意,使用公钥字段是个坏主意。它本身已经够糟糕的了,但是如果你用它来存储,它会变得更糟,因为当其他人改变字段时,你会弄乱空头 如果可以在与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);
}
};
比较器比较器=新比较器(){
@凌驾
公共整数比较(节点1、节点2){
返回node1.key.compareTo(node2.key);
}
};
您可以在任何地方使用此比较器,例如对节点列表进行排序,您只需执行集合。排序(节点,比较器)
您还可以将K绑定到一个接口,该接口为您提供获取key值的方法,并在Heap.java中使用它来定义完整的逻辑,如果您可以在与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);
}
};
比较器比较器=新比较器(){
@凌驾
公共整数比较(节点1、节点2){
返回node1.key.compareTo(node2.key);
}
};
您可以在任何地方使用此比较器,例如对节点列表进行排序,您只需执行集合。排序(节点,比较器)
您还可以将K绑定到一个接口,该接口为您提供了获取key值的方法,并在Heap.java中使用它来定义您的完整逻辑本身我认为您不需要重写
比较器
,您需要调用每个K
的compareTo
方法。如果可以将一个Foo与另一个Foo进行比较,则类Foo是可比较的。您打算如何将一个堆与另一个堆进行比较?在“Google hard”之前,阅读Comparable的javadoc。Comparable的可能副本将转到节点
类,而不是堆
。否则您将比较堆而不是节点。这与K
是泛型无关。由于您无法编辑节点
,因此您需要一个比较器
,而不是创建自然排序。谢谢您Mark Rotterveel您的权利我不知道为什么,但我可以调用compareTo,eclipse没有显示任何错误!我浪费了4个小时,太感谢你了!!我认为您不需要重写compareTo
,您需要调用每个K
的compareTo
方法。如果您可以将一个Foo与另一个Foo进行比较,则类Foo是可比的。您打算如何将一个堆与另一个堆进行比较?在“Google hard”之前,阅读Comparable的javadoc。Comparable的可能副本将转到节点
类,而不是堆
。否则您将比较堆而不是节点。这与K
是泛型无关。由于您无法编辑节点
,因此您需要一个比较器
,而不是创建自然排序。谢谢您Mark Rotterveel您的权利我不知道为什么,但我可以调用compareTo,eclipse没有显示任何错误!我浪费了4个小时,太感谢你了!!