是否有任何方法可以显示与当前时间相比的列表元素(或任何其他可能执行类似功能的元素)。 所以,我制作了一个包含时间的arraylist,它没有任何重复模式,使用方法将其增加10分钟(例如)不会。
我有以下内容:
具有当前时间的日期函数:
Date date = new Date();
DateFormat dateformat = new SimpleDateFormat("HH:mm:ss");
有时间我需要的ArrayList:
ArrayList<String> time = new ArrayList<String>();
time.add("5:40");
time.add("6:40");
time.add("8:30");
time.add("9:45");
time.add("10:35");
time.add("11:10");
time.add("11:55");
time.add("12:20");
time.add("13:30");
time.add("14:55");
time.add("16:00");
time.add("16:30");
time.add("17:30");
time.add("19:00");
time.add("20:10");
time.add("21:10");
现在我很好奇,也因为我是新手,有下一步的方法:
1)考虑到会有很多有时间的数组,有没有办法(可能有一些代码示例)编写一个有参数的方法,以便用户可以选择'时间'他们希望它显示出来吗?
2)是否需要使用循环一次(在本例中为'time'数组)它到达结尾,或者是否可以写入它以便它根据当前时间自动开始。
3)代码优化:这可以用更实用的方式编写吗?
我对此很新,所以任何帮助(包括指导和代码示例)都非常感谢,所以我可以在这个项目中使用它,并作为未来的学习资料。
答案 0 :(得分:3)
使用LocalTime
类而不是String
来表示您的值。 LocalTime
对象用于没有日期且没有时区的时间。
创建List
。
List<LocalTime> list = new ArrayList<>();
通过解析输入字符串填充List
。如果您的输入字符串符合ISO 8601标准,包括一位数小时的填充零,那么您无需定义任何格式设置模式,因为LocalTime
可以直接解析这些值。
list.add( LocalTime.parse( "09:45" ) );
list.add( LocalTime.parse( "10:35" ) );
list.add( LocalTime.parse( "11:10" ) );
如果输入字符串缺少填充零,则定义并使用DateTimeFormatter
。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "h:m" );
…
LocalTime localTime = LocalTime.parse( input , formatter );
对List
进行排序。 Collections.sort
静态方法是单向的。
Collections.sort( list );
获取当前时间。为此,需要一个时区(ZoneId
),作为世界各地按时区的任何时刻的挂钟时间。使用proper time zone name,而不是常见的3-4个字母缩写,例如EST
或IST
。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalTime now = LocalTime.now( zoneId );
循环List
将列表中的每个元素与now
进行比较,使用您考虑的任何规则来定义“最近”。 Duration
类将时间跨度跟踪为总秒数加上小数秒(以纳秒为单位)。
请注意,Duration
类有多种方法可以帮助进行比较。 abs
方法提供absolute value(将底片转换为正值)。 compareTo
方法告诉您一个持续时间是否大于,小于或等于另一个持续时间。
…
for ( LocalTime localTime : list ) {
Duration duration = Duration.between( now , localTime );
…
}
NavigableSet
如果您不介意丢失任何可能的重复时间值,请使用NavigableSet及其ceiling
方法,如the correct answer by Assyrians所示。
答案 1 :(得分:0)
最好使用实际的Date对象并进行比较。但是,如果你需要使用字符串,你可以编写一个比较函数,它接受两个日期并以分钟为单位输出它们之间的差异。
int compare(String d1, String d2) {
//split the strings based on the ":"
string d1Split[] = d1.split(":");
string d2Split[] = d2.split(":");
//convert each one to minutes - note this assumes the string will always be formatted like "hours:minutes:anything else is irrelevant"
d1Mins = d1Split[0] * 60 + d1Split[1];
d2Mins = d2Split[0] * 60 + d2Split[1];
//return the absolute value of the difference between the times in minutes - note this assumes the times will be part of the same day
return Math.abs(d1Mins - d2Mins);
}
一旦你有了比较功能,你需要做的就是通过数组并将每个元素与当前日期进行比较,存储最接近的日期。
int leastDifference = 999999;
String now = dateformat.format(date);
String closest = "";
for (String toCompare : time) {
int comparison = compare(toCompare, now);
if (comparison < leastDifference) {
leastDifference = comparison;
closest = toCompare;
}
}
最接近将包含您要查找的字符串。
答案 2 :(得分:0)
time
列表 String search(String currHrs, List time, int start, int end) {
if (start == end && time.get(start) > currHrs)
return time.get(start);
else
return currHrs;
int mid = (start + end) >> 1;
// discard one half at a time.
return (time.get(mid) > currHrs) ? search(currHrs, time, start, mid): search(currHrs, time, mid + 1, end);
}