Java CompareTo метод начального уровня - PullRequest
0 голосов
/ 03 января 2019

У меня есть задание, в котором мне нужно создать класс ученика, в котором вы храните код ученика neptun (String nep_c) и количество баллов, набранных вами на экзамене (int point_num).Подготовьте публичный метод int getMark (), который возвращает полученный билет на экзамен в зависимости от оценки в соответствии со следующей таблицей:

  • между 100 и 90-> 5;
  • от 90 до 80 -> 4;
  • между 80 и 70 -> 3
  • между 70 и 60 -> 2
  • <60 -> 1

Класс реализуетСопоставимый интерфейс и метод compareTo () сортируют студентов на основе кода Нептуна.В пределах этого, по количеству марок, которые вы получаете.К сожалению, я не понимаю метод comperTo.Можете ли вы помочь мне, как я могу написать правильный код?

public class Student implements Comparable{

private String nep_c;
private int point_num;
private int Mark;

public Student(int point_num, String nep_c) {
    this.point_num = 65;
    this.nep_c= "AAA1BB1";
}

public int getMark(){
    if (point_num <= 100 && point_num > 90)
    Mark = 5;
    else if (point_num <= 90 && point_num > 80)
    Mark = 4;
    else if (point_num <= 80 && point_num > 70)
    Mark = 3;
    else if (point_num <= 70 && point_num > 60)
    Mark = 2;
    else if (point_num <= 60)
    Mark = 1;
    else{
        return 0;
    }
    return Mark;
}

public String getNep_c(){
    return nep_c;
}

public int getPoint_num(){
    return point_num;
}

@Override
public int compareTo (Object o){
    return ???;
}

}

Ответы [ 5 ]

0 голосов
/ 03 января 2019

Метод CompareTo используется для сравнения двух объектов путем указания параметров, которые вы хотите сравнить в теле метода.Но я думаю, вы уже поняли эту часть.

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

  • 0 - если сравниваемые параметры равны.
  • любое положительное целое число - если аргумент больше, чем объект, который вы вызываете методомfrom.
  • любое отрицательное число - если аргумент меньше объекта, из которого вызывается метод.

В качестве примера я использую -1, если этот> аргумент, 0, еслиthis = аргумент, 1, если this <аргумент.Затем метод сортировки позаботится о сортировке элементов на основе возвращаемого значения метода.<a href="https://www.tutorialspoint.com/java/number_compareto.htm" rel="nofollow noreferrer"> Вот пример

0 голосов
/ 03 января 2019

См. Java compaterTo withibn Comparable для информации

compareTo - это функция, которая должна возвращать целое число. Идея состоит в том, что (например) любой внешний алгоритм сортировки использует это для сравнения одного объекта (в вашем случае типа Student) с другим. В процедуре сортировки (которую вы, вероятно, не написали бы: она встроена в коллекцию), ей нужен способ работы, который является «наивысшим» по сравнению с другим студентом, и это то, что предоставляет CompareTo.

Так что в вашем случае, в сравнении, это что-то вроде ...

return -1 if Object o.point_num < this.point_num
return 1 if Object o.point_num > this.point_num
return 0 if Object o.point_num = this.point_num

(кстати, это не Java-код, просто заметки)

Обратите внимание, что CompareTo на самом деле не выполняет сортировку. Для этого вам понадобится коллекция (тип массива) объектов Student. Объект Collection должен иметь встроенный метод .sort.

Что касается того, какая коллекция: зависит от ваших потребностей. Гугл твой друг здесь: -)

0 голосов
/ 03 января 2019

compareTo получает Object, потому что вы реализуете Comparable, а не универсальный Comparable<Student>. Вот почему трудно понять, что нужно сделать.

Измените ваш код следующим образом:

public class Student implements Comparable<Student> {
    ...
    @Override
    public int compareTo(Student other) {
        ...
    }
}

Теперь внутри реализации сравните nep_c этого студента с other.nep_c. Если эти два не равны, вернуть результат сравнения; в противном случае возвращает результат сравнения меток.

Примечание: Существует проблема с вашим методом getMark: он возвращает 1 для студентов с 60 баллами, когда он должен вернуть 2, а также назначает личное поле Mark, которое может быть преобразован в локальную переменную.

0 голосов
/ 03 января 2019

Метод compareTo для Comparable принимает значение, с которым сравнивает текущий объект, и должен возвращать:

  • -1, если текущий объект находится перед другим объектом (можно использовать любое отрицательное целое число),
  • 0, если два объекта равны,
  • 1, если текущий объект приходитпосле другого объекта (можно использовать любое положительное целое число).

Если вы хотите сравнить два объекта по двум разным полям, вы должны сделать следующее (убедитесь, что реализовано Comparable<Student>):

@Override
public int compareTo(Student other) {
    final int comparedNepCode = nep_c.compareTo(other.nep_c);
    if (comparedNepCode == 0) {
        return Integer.compare(getMark(), other.getMark());
    }
    return comparedNepCode;
}

При сравнении чисел вычитание другого из текущего дает возрастающий порядок, поэтому:

  • x < y <=> x - y < 0
  • x = y <=> x - y = 0
  • x > y <=> x - y > 0
0 голосов
/ 03 января 2019

сортировка студентов по коду Нептуна

Две части.Часть первая, измените

implements Comparable

на

implements Comparable<Student>

А затем

@Override
public int compareTo(Student o) {
    return this.nep_c.compareTo(o.nep_c);
}

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

@Override
public int compareTo(Student o) {
    return Integer.compare(getMark(), o.getMark());
}

Если вы хотите отсортировать по коду neptun и использовать метки в качестве тай-брейка, то вы можете сделать что-то вроде

int c = this.nep_c.compareTo(o.nep_c);
if (c != 0) {
    return c;
}
return Integer.compare(getMark(), o.getMark());

Или в Java 8+, используя Comparator.comparing как

return Comparator.comparing(Student::getNep_c)
        .thenComparingInt(Student::getMark).compare(this, o);
...