列表

时间:2016-04-09 17:36:39

标签: java date arraylist time

是否有任何方法可以显示与当前时间相比的列表元素(或任何其他可能执行类似功能的元素)。 所以,我制作了一个包含时间的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)代码优化:这可以用更实用的方式编写吗?

我对此很新,所以任何帮助(包括指导和代码示例)都非常感谢,所以我可以在这个项目中使用它,并作为未来的学习资料。

3 个答案:

答案 0 :(得分:3)

java.time

使用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个字母缩写,例如ESTIST

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)

  1. 获取当前时间的HH:MM部分;
  2. 对您的time列表
  3. 进行排序
  4. 使用二进制搜索:
  5. 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); }