метод compareTo для сравнения по полю LocalDate

263
18 марта 2017, 00:29

Хочу реализовать интерфейс Comparable, и с помощью него произвести сравнение (и последующую сортировку) элементов массива по полю типа LocalDate. Приведенный ниже код дает ошибку dateOfAdmission cannot be resolved or is not a field. Мне посоветовали читать справку с оракла https://docs.oracle.com/javase/8/docs/api/java/time/chrono/ChronoLocalDate.html, но из-за того что мой английский пока что состоит из бед и огорчений, понял я немного. Прошу объяснить мне в чем ошибка и как нужно сделать, что бы я смог сравнивать объекты по полю типа LocalDate. Заранее благодарен. p.s.: клонирование не дописано

package myDefault;
import java.time.*;
import java.util.*;

/*В данной программе ставлю целью повторить пройденный материал по сравнению и клонированию объектов*/
public class Student implements Comparable<LocalDate>, Cloneable
{
private String firstName;
private String lastName;
LocalDate dateOfAdmission;
int scholarship;
Student(String firstName, String lastName, int day, int month, int year, int scholarship)
{
    this.firstName = firstName;
    this.lastName = lastName;
    dateOfAdmission = LocalDate.of(day,month,year);
    this.scholarship = scholarship;
}
public int compareTo(LocalDate other)
{
    return Double.compare(dateOfAdmission, other.dateOfAdmission); 
}
public void fillArray()
{
    Student[] arrayOfStudents = new Student[3];
    Student petya = new Student("Petya","Popov",10,6,2017,1500);
    Student vasya = new Student("Vasya","Ovsyannikov",5,6,2017,1500);
    Student gena = new Student("Gena","Lolov",12,6,2017,1500);
    arrayOfStudents[0] = petya;
    arrayOfStudents[1] = vasya;
    arrayOfStudents[2] = gena;
}
public void createNewArray()
{
    Student[] newArray = new Student[3];
}
public void outputArray(Student[] arrayOfStudents)
{
    int counter;
    for(counter = 0; counter < 3; counter++)
    {
        System.out.println(arrayOfStudents[counter]);
    }
}
public Student clone() throws CloneNotSupportedException
{
    Student cloned = (Student) super.clone();
    return cloned;
}

}

Answer 1

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

int compareTo (LocalDate otherDate) {
    int cmp = (year - otherDate.year);
    if (cmp == 0) {
        cmp = (month - otherDate.month);
        if (cmp == 0) {
            cmp = (day - otherDate.day);
        }
    }
    return cmp;
}

Но это компаратор для LocalDate а вам нужен для студента по этому

int compareTo (Student otherStudent) {
    LocalDate otherDate = otherStudent.dateOfAdmission;
    int cmp = (year - otherDate.year);
    if (cmp == 0) {
        cmp = (month - otherDate.month);
        if (cmp == 0) {
            cmp = (day - otherDate.day);
        }
    }
    return cmp;
}

Это будет компаратор студентов, НО сравнивать он будет только по дате!

READ ALSO
NullPointerException при подключении

NullPointerException при подключении

Я думаю, что излишне будет писать код активитиКласс был успешно испытан на консоли Java

288
Последовательный обход TreeSet Java

Последовательный обход TreeSet Java

Как реализовать последовательный обход дерева на Java? (TreeSet)

402
Проверка интернет соединения

Проверка интернет соединения

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

287
Google Maps в Swing

Google Maps в Swing

Приветствую! Столкнулся с проблемой, что нужно отобразить Google карту в моем Swing приложенииЕдинственные задачи - устанавливать маркеры (правда...

304