Java 列表中最近的时间值

Java 列表中最近的时间值,java,date,arraylist,time,Java,Date,Arraylist,Time,是否有任何方法可以显示列表中的元素(或可能执行类似功能的任何其他元素)与当前时间进行比较。 所以,我制作了一个包含时间的arraylist,它没有任何重复模式,使用方法将时间增加10分钟(例如)是不可能的 我有以下建议: 具有当前时间的日期函数: Date date = new Date(); DateFormat dateformat = new SimpleDateFormat("HH:mm:ss"); 有我需要的时间的ArrayList: ArrayList<String>

是否有任何方法可以显示列表中的元素(或可能执行类似功能的任何其他元素)与当前时间进行比较。 所以,我制作了一个包含时间的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");
ArrayList time=new ArrayList();
加上(“5:40”);
加上(“6:40”);
时间。加上(“8:30”);
加上(“9:45”);
加上(“10:35”);
时间。加上(“11:10”);
加上(“11:55”);
加上(“12:20”);
时间。加上(“13:30”);
时间。加上(“14:55”);
时间。加上(“16:00”);
时间。加上(“16:30”);
时间。加上(“17:30”);
时间。加上(“19:00”);
加上(“20:10”);
加上(“21:10”);
现在我很好奇,也因为我是新手,有没有下一步的方法:

1)考虑到会有很多数组有时间,有没有一种方法(可能有一些代码示例)可以编写一个方法,该方法将有一个参数,以便用户可以选择要显示的“时间”

2)是否需要使用循环一次(在本例中为“时间”数组),它到达末尾,或者可以写入循环,以便根据当前时间自动转到开始

3)代码优化:这是否可以以更实际的方式编写


我对这方面还不太熟悉,因此非常感谢您提供的任何帮助(包括指导和代码示例),以便我可以在本项目中使用它,并将其作为未来项目的学习材料。

最好使用实际的日期对象,并对其进行比较。但是,如果需要使用字符串进行比较,则可以编写一个比较函数,该函数将两个日期进行比较,并在几分钟内输出它们之间的差值

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;
 }
}
int-leastDifference=999999;
String now=dateformat.format(日期);
字符串最接近=”;
for(字符串toCompare:time){
int compare=比较(现在是compare);
如果(比较<最小差异){
最小差异=比较;
最近的=比较;
}
}

最接近的将包含您要查找的字符串。

最好使用实际的日期对象并对其进行比较。但是,如果需要使用字符串进行比较,则可以编写一个比较函数,该函数将两个日期进行比较,并在几分钟内输出它们之间的差值

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;
 }
}
int-leastDifference=999999;
String now=dateformat.format(日期);
字符串最接近=”;
for(字符串toCompare:time){
int comparison=比较(toCompare,现在);
如果(比较<最小差异){
最小差异=比较;
最近的=比较;
}
}
最接近的将包含您要查找的字符串。

java.time 使用类而不是
字符串
来表示您的值。
LocalTime
对象表示一天中没有日期和时区的时间

创建您的应用程序

如果输入字符串缺少填充零,则定义并使用

分类 对
列表进行排序
。静态方法是一种方法

Collections.sort( list );
当前时间 获取当前时间。为此,需要一个时区(),因为世界上任何时刻的挂钟时间都因时区而异。不要使用常见的3-4个字母的缩写,如
EST
IST

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalTime now = LocalTime.now( zoneId );
循环列表 循环
列表
将列表中的每个元素与
立即
进行比较,使用定义“最近”的任何规则。该类以总秒数加上以纳秒为单位的分数秒来跟踪时间跨度

注意,
Duration
类有各种方法来帮助比较。该方法给出了一种新的方法(将负片转换为正片)。该方法告诉您一个持续时间是否大于、小于或等于另一个持续时间

…
for ( LocalTime localTime : list ) {
    Duration duration = Duration.between( now , localTime );
    …
}
NavigableSet
如果您不介意丢失任何可能的重复时间值,请使用a及其方法,如所示。

java.time 使用类而不是
字符串
来表示您的值。
LocalTime
对象表示一天中没有日期和时区的时间

创建您的应用程序

如果输入字符串缺少填充零,则定义并使用

分类 对
列表进行排序
。静态方法是一种方法

Collections.sort( list );
当前时间 获取当前时间。为此,需要一个时区(),因为世界上任何时刻的挂钟时间都因时区而异。不要使用常见的3-4个字母的缩写,如
EST
IST

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalTime now = LocalTime.now( zoneId );
循环列表 循环
列表
将列表中的每个元素与
立即
进行比较,使用定义“最近”的任何规则。该类以总秒数加上以纳秒为单位的分数秒来跟踪时间跨度

注意,
Duration
类有各种方法来帮助比较。该方法给出了一种新的方法(将负片转换为正片)。该方法告诉您一个持续时间是否大于、小于或等于另一个持续时间

…
for ( LocalTime localTime : list ) {
    Duration duration = Duration.between( now , localTime );
    …
}
NavigableSet
如果您不介意丢失任何可能的重复时间值,请使用及其方法,如中所示

  • 获取当前时间的HH:MM部分
  • 对您的
    时间
    列表进行排序
  • 使用二进制搜索:
  • 字符串搜索(字符串当前小时数、列表时间、整数开始、整数结束){
    如果(开始==结束和时间.获取(开始)>当前小时数)
    返回时间。获取(开始);
    其他的
    返回货币小时数;
    int mid=(开始+结束)>>1;
    //一次丢弃一半