java - 在对象列表中获取 ActualDate 或 Previous date
问题描述
我有一个具有以下实现的类。
class Vehicle {
private Date date;
private int nbOfVehicleArriving;
public Vehicle(Date date, int nbOfVehicleArriving) {
this.date = date;
this.nbOfVehicleArriving = nbOfVehicleArriving;
}
public int getNbOfVehicleArriving() {
return nbOfVehicleArriving;
}
}
我有这个对象的列表。我需要让日期等于或早于 dateTime 以显示 int 值
01/01/2018 00:00:00 12
01/01/2018 00:10:00 10
01/01/2018 01:00:00 5
01/01/2018 01:10:00 10
例子 :
01/01/2018 00:00:00 will give me 12
01/01/2018 00:01:00 will give me 12
01/01/2018 00:10:00 10 will give me 10
01/02/2018 01:10:00 10 (last value known : 10)
我知道我可以做一个 for 循环,但这是最好的方法吗?
谢谢
解决方案
我对您的Vehicle
课程进行了一些修改,因为我认为任何人都不应该Date
在 2018 年使用早已过时的课程:
public class Vehicle {
public static final ZoneId TIME_ZONE = ZoneId.of("Europe/Nicosia");
public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("MM/dd/uuuu HH:mm:ss");
private Instant date;
private int nbOfVehicleArriving;
public Vehicle(String date, int nbOfVehicleArriving) {
this.date = LocalDateTime.parse(date, FORMATTER).atZone(TIME_ZONE).toInstant();
this.nbOfVehicleArriving = nbOfVehicleArriving;
}
// getters etc.
}
假设您的列表已排序
Instant time = LocalDateTime.parse("01/01/2018 00:00:00", Vehicle.FORMATTER)
.atZone(Vehicle.TIME_ZONE)
.toInstant();
OptionalInt number = myList.stream()
.takeWhile(v -> !v.getDate().isAfter(time))
.max(Comparator.comparing(Vehicle::getDate))
.map(v -> OptionalInt.of(v.getNbOfVehicleArriving()))
.orElseGet(OptionalInt::empty);
number
在这种情况下,结果是OptionalInt[12]
。其他结果:
- 如果时间是 01/01/2018 00:01:00,结果仍然是
OptionalInt[12]
. - 时间 01/01/2018 00:10:00 给出
OptionalInt[10]
。 - 时间 01/02/2018 01:10:00 也是如此。
- 第一个列表元素之前的时间,例如 01/01/1979 00:00:00,给出
OptionalInt.empty
. 这是我想给出结果的一个原因OptionalInt
(另一个是考虑到一个空列表)。
我不太清楚这是否比循环更好。你决定。
如果您的列表很长(例如一百万辆汽车)并且您遇到性能问题,您将需要使用二分搜索。流将完全不适合此。您可以在其他地方阅读有关二分搜索的信息。
如果您不能确定列表是否已排序,您只需要使用filter
而不是takeWhile
:
OptionalInt number = myList.stream()
.filter(v -> !v.getDate().isAfter(time))
.max(Comparator.comparing(Vehicle::getDate))
.map(v -> OptionalInt.of(v.getNbOfVehicleArriving()))
.orElseGet(OptionalInt::empty);
链接: Oracle 教程:日期时间解释如何使用java.time
,我从哪里Instant
上课。
推荐阅读
- meteor - Meteor 按分数创建用户排名
- javascript - React Native 启动失败,错误代码 -4094 如何解决这个 ONCE for ALL?
- firebase - 谷歌播放| 由于此政策,应用状态已被拒绝且未发布。原因:您的应用的内容分级不正确
- puppeteer - 我们如何理解工作线程是否使用 Puppeteer API 运行 webassembly?
- complex-data-types - MongoDB 指南针无法 [选择类型] 选择特定类型
- spring - Spring @Transactional:第二个线程不应该等到第一个线程提交/回滚吗?
- c++ - 输入 ctrl + x 后如何再次 cin (cin<
这是我的代码
stream& operator>>(istream& is, fraction& f) { is >> f.numerator; cout << "/"; is
- python - AttributeError:“str”对象没有属性“get”(django 视图)
- react-native - React Native - 有没有办法完全隐藏键盘?
- excel - 满足条件时,我正在尝试将输出粘贴到单独的工作表中