Java : 如何使用 `Comparator` 接口
Java : How to use the `Comparator` interface
private class myComparator implements Comparator<Object>{
@Override
public int compareTo(Object obj1, Object obj1) {
if ((obj1.getNumber() - obj2.getNumber()) == 0) {
return 0;
}
if ((obj1.getNumber() > obj2.getNumber()) {
return 1;
}
return -1;
}
嘿,我不知道如何在我正在实现的比较器 class 中实现这个 compareTo 方法。我正在尝试将两个对象的整数值按升序进行比较。但是我真的不知道我要去哪里
稍后,我将在另一个 class 中将此 class 称为 collections.sort(someList, myComparator)。
对象没有 getNumber 方法。由于您已经在使用泛型,因此比较方法签名应该是:
public int compare(Event obj1, Event obj1) {
^^
对于 Comparator,您需要覆盖比较方法而不是 compareTo。
现在您可以对事件对象使用 getNumber。另外你不应该使用 number1 - number2 因为它可能会导致数字溢出,因此我建议你使用类似的东西:
num1<num2 ? -1 : (num1==num2 ? 0 : 1)
首先,Comparator
需要一个compare
方法,而不是compareTo
。并且由于您的 class 实现了 Comparator<Event>
,该方法的参数应该是 Event
s.
private class myComparator implements Comparator<Event>
{
@Override
public int compare(Event obj1, Event obj1) {
if (obj1 == null) {
if (obj2 == null) {
return 0;
} else {
return 1;
}
} else if (obj2 == null) {
return -1;
}
return obj1.getNumber().compareTo(obj2.getNumber());
}
}
请注意,我假设 getNumber()
永远不会 return 为空。如果可以 return null,则需要进行更多的 null 检查。
编辑后,您的 Comparator
现在采用 Object
类型。下面解释的相同规则将适用于您的 Comparator<Object>
。但是,如果没有显式转换,您将无法调用 getNumber
方法,因为对象没有任何此类方法。
使用Comparator
需要注意以下几点
- 您实现了
Comparator<Event>
接口。这意味着您要比较两个 Event
个对象。
- A
Comparator
没有 compareTo
方法。它有一个 compare
方法,该方法将采用您正在实施的 Comparator
类型的两个参数。由于您实现了 Comparator<Event>
,因此您的 compare
方法应该采用 2 Event
个参数。
- 阅读
Comparator
中 compare 方法的 java-doc
。它解释了 int
return 值代表什么。如果 getNumber
return 是一个数字,请避免减法,否则您可能会成为溢出的受害者。
- 您已声明
myComparator
为 private
class。仅当 myComparator
是内部 class 时才允许这样做。
我故意不提供更正后的代码,因为我想避免用勺子喂你答案。
比较器接口没有 compareTo 方法。它有 compare 方法。
第二件事,因为你是 Comparator is generified with Event type class/interface,改变方法签名如下。
public int compare(Event obj1, Event obj2) {
}
一般规则,如果两个对象相等,则 return 0,如果第一个对象大于第二个[在比较逻辑中],则 return 1 否则 return -1。
private class myComparator implements Comparator<Object>{
@Override
public int compareTo(Object obj1, Object obj1) {
if ((obj1.getNumber() - obj2.getNumber()) == 0) {
return 0;
}
if ((obj1.getNumber() > obj2.getNumber()) {
return 1;
}
return -1;
}
嘿,我不知道如何在我正在实现的比较器 class 中实现这个 compareTo 方法。我正在尝试将两个对象的整数值按升序进行比较。但是我真的不知道我要去哪里
稍后,我将在另一个 class 中将此 class 称为 collections.sort(someList, myComparator)。
对象没有 getNumber 方法。由于您已经在使用泛型,因此比较方法签名应该是:
public int compare(Event obj1, Event obj1) {
^^
对于 Comparator,您需要覆盖比较方法而不是 compareTo。
现在您可以对事件对象使用 getNumber。另外你不应该使用 number1 - number2 因为它可能会导致数字溢出,因此我建议你使用类似的东西:
num1<num2 ? -1 : (num1==num2 ? 0 : 1)
首先,Comparator
需要一个compare
方法,而不是compareTo
。并且由于您的 class 实现了 Comparator<Event>
,该方法的参数应该是 Event
s.
private class myComparator implements Comparator<Event>
{
@Override
public int compare(Event obj1, Event obj1) {
if (obj1 == null) {
if (obj2 == null) {
return 0;
} else {
return 1;
}
} else if (obj2 == null) {
return -1;
}
return obj1.getNumber().compareTo(obj2.getNumber());
}
}
请注意,我假设 getNumber()
永远不会 return 为空。如果可以 return null,则需要进行更多的 null 检查。
编辑后,您的 Comparator
现在采用 Object
类型。下面解释的相同规则将适用于您的 Comparator<Object>
。但是,如果没有显式转换,您将无法调用 getNumber
方法,因为对象没有任何此类方法。
使用Comparator
- 您实现了
Comparator<Event>
接口。这意味着您要比较两个Event
个对象。 - A
Comparator
没有compareTo
方法。它有一个compare
方法,该方法将采用您正在实施的Comparator
类型的两个参数。由于您实现了Comparator<Event>
,因此您的compare
方法应该采用 2Event
个参数。 - 阅读
Comparator
中 compare 方法的java-doc
。它解释了int
return 值代表什么。如果getNumber
return 是一个数字,请避免减法,否则您可能会成为溢出的受害者。 - 您已声明
myComparator
为private
class。仅当myComparator
是内部 class 时才允许这样做。
我故意不提供更正后的代码,因为我想避免用勺子喂你答案。
比较器接口没有 compareTo 方法。它有 compare 方法。 第二件事,因为你是 Comparator is generified with Event type class/interface,改变方法签名如下。
public int compare(Event obj1, Event obj2) {
}
一般规则,如果两个对象相等,则 return 0,如果第一个对象大于第二个[在比较逻辑中],则 return 1 否则 return -1。