java - 为什么两个 LocalDate 变量之间的比较不起作用?

标签 java localdate

我在 Main 类中创建了一个 Flight 类型的 ArrayList。Flight 也是一个包含 LocalDate 变量、getter 和 setter 的类。在 main 中,我创建了一个 boolean 标志 theDay 并设置为 true。我希望当 For 循环找到与之前相同的 LocalDate 日期值时,此标志更改为 false。 例如:

第一次尝试:我将值 3 放入 Scanner.nextInt() 中; 它打印了 2019-5-3 和“没有找到相同的日期。”

第二次尝试:我将值 6 放入 Scanner.nextInt() 中; 它打印了 2019-5-6 和“没有找到相同的日期。”

第三次尝试:我再次将值 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");
    }
}

最佳答案

您永远不会在列表中添加任何实例。 根据您的期望:

  • 第一次尝试:我将值 3 放入 scanner.nextInt();它打印了2019-5-3"Didn't found a same date."
  • 第二次尝试:我输入了值 6进scanner.nextInt();它打印了2019-5-6"Didn't found a same date."
  • 第三次尝试:我再次将值 3 放入 scanner.nextInt();它打印了2019-5-3"Didn't found a same date." 我预计会收到“找到相同日期”的消息。

您需要插入 flighttheDay当没有匹配的出发日期时为 true。

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将为您做。

您所需要做的就是实现equalshashCode正确的话你的代码将看起来像:

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;
    }
}

关于java - 为什么两个 LocalDate 变量之间的比较不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56040714/

相关文章:

java - Android 并获取将 id 转换为字符串的 View

IntelliJ IDEA 中的 JavaFX 应用程序无法在资源中找到 CSS 文件

java - 如何在另一个字符串中搜索一个字符串?

java - 始终在 egit 中使用远程存储库

java - LocalDate.parse 是否会默默地更正天数?

java - Libgdx 加载 blender 模型,透明度不正确

java - 如何将这种格式的字符串转换为Java 8时间并转换为长毫秒

Java:为什么 java.LocalDate 格式在 2018-10-25 到 2019-10-25 之间给出 0 天?

java - LocalDate 的 Mapstruct 默认值

java - 在 Java 10 与 Java 8 中从纪元以来的毫秒转换为 LocalDateTime