2015-06-02 2 views
-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; 
     } 

Эй, я не знаю, как реализовать этот метод compareTo в классе Comparator, который я реализую. Я пытаюсь сравнить целые значения двух объектов в порядке возрастания. Но я действительно не уверен, куда я идуJava: Как использовать интерфейс `Comparator`

Позже я буду называть этот класс как collection.sort (someList, myComparator) в другом классе.

+1

Вы пробовали хотя бы * компилировать * это? –

+1

*** частный класс !!! *** Вы уверены? –

+0

Поскольку ваш компаратор имеет тип ** **, ваши объекты ** obj1 ** и ** obj2 ** должны быть явно объявлены как объекты ** Объект **, а не ** Объект ** Объекты – pnadczuk

ответ

0

После вашего редактирования ваш Comparator теперь принимает тип Object. Те же правила, которые описаны ниже, будут применяться для вашего Comparator<Object>. Однако вы не сможете вызвать метод getNumber без явного литья, поскольку у объекта нет такого метода.


Вы должны принять во внимание следующие моменты, если вы используете Comparator

  1. Вы реализуете интерфейс Comparator<Event>. Это означает, что вы хотите сравнить два объекта Event.
  2. A Comparator не имеет метода compareTo. Он имеет метод compare, который будет принимать два параметра типа Comparator, который вы реализуете. Поскольку вы реализуете Comparator<Event>, ваш метод compare должен принимать аргументы 2 .
  3. Прочитано java-doc для метода compare в Comparator. Он объясняет, что представляет собой возвращаемое значение int. Если getNumber возвращает число, избегайте вычитания или вы можете стать жертвой переполнения.
  4. Вы объявили myComparator классом private. Это допустимо, только если myComparator является внутренним классом.

Я сознательно не предоставил исправленный код, поскольку я хочу, чтобы ложка не подавала вам ответ.

0

Объект не имеет метода getNumber. Как вы уже используете Generics, сравнить метод подпись должна быть:

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

С Компаратор вам нужно переопределить метод сравнения и не СотрагеТо.

И теперь вы можете использовать getNumber для объекта события. Кроме того, вы не должны использовать Number1 - number2, поскольку это может вызвать переполнение числа, и, следовательно, я хотел бы предложить вам использовать что-то вроде:

num1<num2 ? -1 : (num1==num2 ? 0 : 1) 
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, требуется больше нулевых проверок.

+0

Я думаю ** частный модификатор ** не допускается. –

+0

@NeerajJain Это внутренний класс. Вы уверены, что понимаете ответ Эрана? – CKing

+0

@ChetanKinger и почему вы думаете, что это внутренний класс? –

0

Интерфейс компаратора не имеет compareTo метод.Он имеет вместо. Во-вторых, поскольку вы являетесь Компаратором, сгенерирован с классом/интерфейсом типа события, измените следующую подпись метода.

общественного ИНТ сравнить (obj1 событие, событие obj2) {

}

Общее правило, если два объекта равны, то возвращают 0, если первый объект больше, чем второй [в логике сравнения], а затем возврат 1 else return -1.