Реализация сопоставимого интерфейса - PullRequest
3 голосов
/ 18 мая 2011

Я только что нашел этот экзаменационный вопрос и не могу понять:

Ниже изображен надуманный частичный класс, который реализует интерфейс Comparable. Единственная цель этого придуманного класса - сравнение его экземпляров с заданной строкой.

Есть две вещи, которые нам нужно заполнить в классе, чтобы закончить его. Вот класс:

public class PrivateComparableClass // FILL IN PART 1 { 
   private String thing;

    public PrivateComparableClass(String thing) {
     this.thing=thing;
    }
   //FILL IN PART 2
}

Я предполагаю, что часть 1 просто соответствует:

public class PrivateComparableClass implements Comparable {

И часть 2, я предполагаю, что он ожидает реализации метода CompareTo, но я не знаю, как правильно реализовать это:

public static int compareTo() {
  if this.thing.equals(thing){
  return 1;
  } else {
    return -1;
  }
}

Как мне исправить это?

Ответы [ 4 ]

5 голосов
/ 18 мая 2011

Прежде всего, часть 1 должна быть действительно:

public class PrivateComparableClass implements Comparable<PrivateComparableClass> {

Что касается части 2, то, если thing - единственный элемент данных в классе, вы можете просто добавить String.compareTo:

public int compareTo(PrivateComparableClass rhs) {
  return this.thing.compareTo(rhs.thing);
}

Я рекомендую вам прочитать о том, как compareTo должен работать (возможны три результата: меньше, равно и больше).

2 голосов
/ 18 мая 2011

Во-первых, интерфейс Comparable является общим; ваши объявления должны указывать параметр типа:

public class PrivateComparableClass 
  implements Comparable<PrivateComparableClass> {

Затем вы должны сравнить thing членов класса в методе compareTo() (который является методом экземпляра, а не членом класса).

@Override
public final int compareTo(PrivateComparableClass that) {
  return this.thing.compareTo(that.thing);
}

Хорошо себя ведущий Comparable должен реализовать метод equals(), который согласуется с его compareTo() методом:

@Override
public final boolean equals(Object obj) {
  if (obj == this)
    return true;
  if (!(obj instanceof PrivateComparableClass))
    return false;
  return compareTo((PrivateComparableClass) obj) == 0;
}

И, когда вы переопределяете equals(), вам также нужно переопределить hashCode():

@Override
public final int hashCode() {
  return thing.hashCode();
}

Если thing действительно разрешено равным null, подходящее поведение проверки на ноль должно быть добавлено к каждому методу.

2 голосов
/ 18 мая 2011

Чтобы немного расширить:

Функции компаратора обычно принимают два аргумента (назовем их A и B) и следуют соглашению возврата

  • -1, если A 0, если A == B
  • 1, если A> B

Кроме того, compareTo не должно объявляться как static, если вы используете переменную экземпляра.

0 голосов
/ 18 мая 2011

Ну, это более или менее так, как класс должен быть объявлен и реализован

public class PrivateComparableClass implements Comparable<PrivateComparableClass>
{
    private String thing;
    //... other stuff

    public int compareTo(PrivateComparableClass o)
    {
       return this.thing.compareTo(o.thing);
    }
}
...