Почему сравнение двух переменных LocalDate не работает? - PullRequest
0 голосов
/ 08 мая 2019

Я создал ArrayList типа Flight в главном классе. Также Flight - это класс, который содержит переменную LocalDate, методы получения и установки. В основном я создал логический флаг theDay и установил в true. Я хочу, чтобы этот флаг изменился на false, когда цикл For находит значение дня LocalDate, как и раньше. Например:

1-я попытка: я поместил значение 3 в scanner.nextInt (); На нем были напечатаны 2019-5-3 и «Не нашли ту же дату».

2nd Try: я вставил значение 6 в scanner.nextInt (); На нем напечатаны 2019-5-6 и «Не нашли ту же дату».

3-я попытка: я снова поместил значение 3 в scanner.nextInt (); На нем были напечатаны 2019-5-3 и «Не нашли ту же дату». Ожидалось, что я получу сообщение «Найдена та же дата».

public static void main(String[] args) {
    ArrayList<Flight> flightList = new ArrayList<Flight>();
    Scanner scanner = new Scanner(System.in);

    int counter=1;
    while (counter <= 3) {
        Flight flight = new Flight();

        System.out.println("Give the day of the departure.");

        LocalDate day = LocalDate.of(2019, Month.MAY, scanner.nextInt());
        flight.setDateOfDeparture(day);

        System.out.println(flight.getDateOfDeparture());

        boolean theDay = true; //Flag (reversed way in order to achieve the TRUE logic value).
        for (Flight flight1 : flightList) {
            System.out.println(flight1.getDateOfDeparture());

            if (flight1.getDateOfDeparture().compareTo(flight.getDateOfDeparture()) == 0) {
                theDay = false;
            }
        }

        counter++;

        if (theDay){
            System.out.println("Didn't found a same day.");
        }else
            System.out.println("A same date found");
    }
}

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Это происходит потому, что вы не добавляете свой рейс к вашему flightList, поэтому он всегда пуст.Измените свой код, чтобы добавить рейс, когда дата не найдена, в вашем заявлении if:

if (theDay){
      System.out.println("Didn't found a same day.");
      flightList.add(flight);
} else {
      System.out.println("A same date found");
}
1 голос
/ 08 мая 2019

Вы никогда не добавляете ни одного экземпляра в свой список. Исходя из ваших ожиданий:

  • 1-я попытка: я поместил значение 3 в scanner.nextInt(); Он напечатал 2019-5-3 и "Didn't found a same date."
  • 2-я попытка: я поставил значение 6 scanner.nextInt(); напечатано 2019-5-6 и "Didn't found a same date."
  • 3-я попытка: я снова поместил значение 3 в scanner.nextInt(); На нем напечатано 2019-5-3 и "Didn't found a same date." Я ожидал получить сообщение "Найдена та же дата".

Вам нужно вставить flight, если theDay истинно, когда дата отправления уже не совпадает.

if (theDay){
    flightList.add(flight);
    System.out.println("Didn't found a same day.");
}else{
    System.out.println("A same date found");
}

Когда вы будете готовы двигаться вперед, вы можете использовать Set<Flight> с правильной реализацией эквивалентности

Вам никогда не потребуется проверять себя, если уже существует «эквивалентный» экземпляр, Set сделает это за вас.

Все, что вам нужно, это правильно реализовать equals и hashCode, и ваш код будет просто выглядеть так:

Set<Flight> flights = new HashSet<>();

Scanner sc = new Scanner(System.in);
for(int i = 0; i < 5; ++i){
    Flight f = new Flight();
    f.setDeparture(LocalDate.of(2019, Month.MAY, sc.nextInt()));

    if(flights.add(f)){
        System.out.println("New flight added");
    } else {
        System.out.println("Flight already booked");
    }
}

sc.close();

И чтобы дать вам представление, вот сгенерированные методы eclipse для простого класса

class Flight {
    LocalDate departure;

    public void setDeparture(LocalDate departure) {
        this.departure = departure;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((departure == null) ? 0 : departure.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Flight other = (Flight) obj;
        if (departure == null) {
            if (other.departure != null)
                return false;
        } else if (!departure.equals(other.departure))
            return false;
        return true;
    }
}
...