Как правильно использовать equals () при сравнении индекса массива объектов и объекта? - PullRequest
0 голосов
/ 17 сентября 2018

Согласно этому ответу , грубо говоря, если бы у нас был массив объектов учеников в классе, class [index]! = Student1. Я считаю, что это ошибка, которую я допускаю при реализации моего метода equals для сравнения объекта array [index] с другим объектом. Я полагал, что массив [индекс] и объект, с которым я сравниваю, совпадают.

В приведенном ниже коде показан мой метод getNumStudents, в котором я пытаюсь подсчитать, сколько раз идентификатор ученика появляется в классе. Идентификатор представляет обувь бренда, которую он или она любит (практические упражнения вне лекции). Этот метод в моем классе объектов класса, который реализует интерфейс.

@Override
public int getNumStudents(T anEntry) {
    int count = 0;
    for (int index = 0; index < numberOfEntries; index++) {

       if (roster[index].equals(anEntry)) )
        {
            counter++;
        } 
    } 

    return count;
}

Мой метод равных как таковой и реализован в классе ученика:

public boolean equals(Student student) {
    if (this == student)
    {
        return true;
    }
    if (student == null)
    {
        return false;
    }
    if (this.getID() != student.getID())
    {
        return false;
    }

    return true;
}

Я не знаю, правильно ли я сделал переопределение hashCode, но вот оно (в классе Student):

   @Override
    public int hashCode() {
    int result = 17;
    result = 31 * result + studentID;
    return result;
  }

Я сузил, где ошибка, скорее всего, здесь:

   if (roster[index].equals(anEntry)) )

конкретно

roster[index].equals(anEntry))

Как мне вызвать или как настроить метод getNumStudents (T anEntry), чтобы он правильно возвращал количество студентов с определенным идентификатором (представляющим тип обуви) в массиве объектов Classroom?

1 Ответ

0 голосов
/ 17 сентября 2018

Ваша equals подпись неверна.

Правильная подпись метода equals должна выглядеть следующим образом.

public boolean equals(Object other)

Тогда внутри метода вы должны проверить, имеет ли онсопоставимого типа, и если вам действительно нужно, чтобы он был типа Student, вы должны проверить это и вернуть false в противном случае.

В вашем случае это будет минимальное изменение, требуемое для вашей реализации:

public boolean equals(Object other)
{
    if (this == other)
    {
        return true;
    }

    // This also works if `other` is `null`
    if (!(other instanceof Student))
    {
        return false;
    }

    // Now we cast it to `Student`
    final Student student = (Student) other;

    if (this.getID() != student.getID())
    {
        return false;
    }

    return true;
}
...