java - 为什么两个 LocalDate 变量之间的比较不起作用?
问题描述
我在 Main 类中创建了一个 Flight 类型的 ArrayList。Flight 也是一个包含 LocalDate 变量、getter 和 setter 的类。我主要创建了一个布尔标志 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();
It print 中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>
具有正确等效实现的 a
如果已经有一个“等效”实例,您将永远不需要检查自己,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;
}
}
推荐阅读
- chatbase - Chatbase 一次发送多条消息错误序列
- react-native - 是否可以使用 StackNavigator 进行滑动导航?
- sql-server - 如何在不丢失完整数据的情况下删除最后插入的数据
- node.js - 如何在 MongoDB 的 Array 字段中投影特定元素?
- go - 为什么 curl 给我的用户错误的 json?
- sql - 从表中删除几条主键引用为不同表中外键的记录
- javascript - 我们如何在 reactjs 中简单地上传文件夹?
- php - 如何发现未使用的文件
- c# - MessageBox.Show 对话框结果 / C# .NET 2017 社区
- javascript - 根据选择选项填充文本字段