Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何重写compareTo方法?_Java_Comparable - Fatal编程技术网

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个小时,太感谢你了!!