gpt4 book ai didi

Java 比较器接口(interface)

转载 作者:行者123 更新时间:2023-12-01 17:46:22 24 4
gpt4 key购买 nike

我对Comparator接口(interface)及其方法compare有一个误解这是下面的代码,我想知道为什么比较方法返回 -33 我相信它应该返回 33

import java.util.*;
public class Sorted implements Comparable<Sorted>, Comparator<Sorted> {
private int num;
private String text;

Sorted(int n, String t) {
this.num = n;
this.text = t;
}

public String toString() {
return "" + num;
}

public int compareTo(Sorted s) {
return text.compareTo(s.text);
}

public int compare(Sorted s1, Sorted s2) {
System.out.println(s1.num-s2.num); // return -33
return s1.num - s2.num;
}
public static void main(String[] args) {
Sorted s1 = new Sorted(88, "a");
Sorted s2 = new Sorted(55, "b");
TreeSet<Sorted> t1 = new TreeSet<>();
t1.add(s1); t1.add(s2);
TreeSet<Sorted> t2 = new TreeSet<>(s1);
t2.add(s1); t2.add(s2);
System.out.println(t1 + " " + t2);
System.out.println(s1.num-s2.num); // prints 33
} }

最佳答案

您可能知道,如果a-b=c,则b-a=-c

这里发生的情况非常相似。您似乎假设 TreeSet 调用 compare 方法,如下所示:

comparator.compare(s1, s2)

(请注意,我使用 s1s2 进行演示。它们显然不在 TreeSet 的范围内。s1 与您的 s1 相同,s2 与您的 s2` 相同。)

但它也可以像这样调用compare:

comparator.compare(s2, s1)

不可以吗?

如果它以第二种方式调用它,那么预期的结果是-33

编辑:

我查看了 TreeSet.add 的源代码,发现它使用您要添加的项目作为键来调用 TreeMap.put 。如果您进一步查看 TreeMap.put,您会发现:

Comparator<? super K> cpr = comparator;
if (cpr != null) {
do {
parent = t;
cmp = cpr.compare(key, t.key); // <--- "key" is the key passed into this method
// "t" is an element that is already in the map
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else
return t.setValue(value);
} while (t != null);
}

这表明 TreeSet 确实按照我描述的方式调用了 compare

编辑:

正如 Holger 在评论中所说,您不应该通过减去两个整数来实现 Comparator 。相反,您应该使用 Integer.compare:

return Integer.compare(s1.num, s2.num);

其实根本不需要实现Comparator,创建时传入一个Comparator.comparingInt(s -> s.num)即可树形图:

TreeSet<Sorted> t1 = new TreeSet<>(Comparator.comparingInt(s -> s.num));

关于Java 比较器接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54722132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com