Java:如何使用`Comparator`接口

时间:2015-06-02 07:10:37

标签: java object comparator compareto

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;
        }

嘿我不知道如何在我正在实现的Comparator类中实现这个compareTo方法。我正在尝试比较两个对象的整数值,以升序。但我真的不确定我要去哪里

稍后,我将在另一个类中将此类称为collections.sort(someList,myComparator)。

4 个答案:

答案 0 :(得分:1)

首先,Comparator需要compare方法,而不是compareTo。由于您的类实现了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()永远不会返回null。如果它可以返回null,则需要更多的空检查。

答案 1 :(得分:1)

比较器接口没有 compareTo 方法。它改为比较方法。 第二件事,既然你是Comparator,那就是使用事件类型类/接口,将方法签名改为:

public int compare(Event obj1,Event obj2){

}

一般规则,如果两个对象相等则返回0,如果第一个对象大于第二个[在比较逻辑中]则返回1,否则返回-1。

答案 2 :(得分:0)

对象没有getNumber方法。正如您已经使用泛型,您比较方法签名应该是:

public int compare(Event obj1, Event obj1) {
                  ^^

使用Comparator,您需要覆盖compare方法而不是compareTo。

现在你可以在事件对象上使用getNumber。你也不应该使用number1 - number2,因为它可能导致数字溢出,因此我建议你使用类似的东西:

num1<num2 ? -1 : (num1==num2 ? 0 : 1)

答案 3 :(得分:0)

编辑完成后,Comparator现在采用Object类型。以下说明的相同规则适用于您的Comparator<Object>。但是,如果没有显式转换,您将无法调用getNumber方法,因为对象没有任何此类方法。

如果您使用Comparator

,则应注意以下几点
  1. 您实现了Comparator<Event>接口。这意味着您要比较两个Event个对象。
  2. Comparator没有compareTo方法。它有一个compare方法,它将采用您正在实现的Comparator类型的两个参数。自您实施Comparator<Event>后,您的compare方法应该有2个Event个参数。
  3. java-doc中阅读Comparator方法的int。它解释了getNumber返回值代表什么。如果myComparator返回一个数字,请避免减法,否则您可能会成为溢出的受害者。
  4. 您已将private声明为myComparator类。仅当SELECT server, title FROM tickets ORDER BY time DESC, title ASC, server ASC LIMIT 5 是内部类时才允许这样做。
  5. 我故意不提供更正后的代码,因为我想避免用勺子喂你答案。