我正在尝试计算公交车时刻表的剩余时间。所以我在ArrayList中存储了所有表的列表,我想一次只计算一个时间表的剩余时间。例如,假设列表有8:00和8:15,当前时间是7:55。我想要的是用8:00而不是8:15计算剩余时间,如果当前时间是8:01,计算应该在8:15而不是8:00进行。如果你们帮我(任何链接或样本方法),那将是太棒了。
答案 0 :(得分:1)
很多情况归结为您存储时间信息的方式,例如,如果您使用Date
或LocalTime
之类的内容,则可以简单地对List
次和使用Collections.binarySearch
找到合适的时间......
List<LocalTime> times = new ArrayList<>(25);
times.add(LocalTime.of(9, 0));
times.add(LocalTime.of(8, 45));
times.add(LocalTime.of(8, 30));
times.add(LocalTime.of(8, 15));
times.add(LocalTime.of(8, 0));
times.add(LocalTime.of(7, 45));
times.add(LocalTime.of(7, 30));
times.add(LocalTime.of(7, 15));
times.add(LocalTime.of(7, 0));
int result = Collections.binarySearch(times, LocalTime.of(7, 55), new Comparator<LocalTime>() {
@Override
public int compare(LocalTime o1, LocalTime o2) {
LocalTime startRange = o1.minusMinutes(15);
LocalTime endRange = o1;
if ((o2.equals(o1) || startRange.isBefore(o2)) && (o2.equals(o1) || o2.isBefore(o1))) {
return 0;
}
return o1.compareTo(o2);
}
});
if (result >= 0) {
System.out.println(times.get(result));
}
哪个输出08:00
现在,
if ((o2.equals(o1) || startRange.isBefore(o2)) && (o2.equals(o1) || o2.isBefore(o1))) {
匹配一个确切的时期(例如7:45-8:00),这可能不是你想要的(所以它是8点,你可能错过了公共汽车; ))所以你可以使用像
这样的东西if (startRange.isBefore(o2) && o2.isBefore(o1)) {
例如,将匹配7:46-7:59,或根据您的需要组合......
答案 1 :(得分:0)
假设列表已排序,您可以遍历列表并返回差异为正的第一个元素。
伪代码:
for each time in timetable:
difference = time - current_time
if difference > 0: return difference