我有很多时间信息,格式为hh:mm,我想知道是否有一个很好的方法来获取这些信息并将其与当前时间进行比较。假设我有一天的时间列表,我想知道这个字符串数组中的哪个时间是今天尚未通过的第一个时间。
我正在查看Calendar API,我想我可以通过将它分成“:”来将字符串分解为小时和分钟,然后从中创建一个日历对象,但这似乎效率很低。
只是寻找一些意见;谢谢, 罗布
<string-array name="example">
<item>6:58</item>
<item>7:41</item>
<item>8:08</item>
<item>8:28</item>
<item>8:48</item>
<item>9:08</item>
<item>9:43</item>
<item>10:13</item>
<item>10:43</item>
<item>11:13</item>
<item>11:43</item>
<item>12:09</item>
<item>12:29</item>
<item>12:49</item>
<item>1:09</item>
<item>1:29</item>
<item>1:49</item>
<item>2:09</item>
<item>2:29</item>
<item>2:49</item>
<item>3:09</item>
<item>3:29</item>
<item>3:49</item>
<item>4:09</item>
<item>4:29</item>
<item>4:49</item>
<item>5:09</item>
<item>5:29</item>
<item>5:49</item>
<item>6:29</item>
<item>7:09</item>
<item>7:47</item>
<item>8:27</item>
<item>9:07</item>
<item>9:47</item>
<item>10:27</item>
</string-array>
答案 0 :(得分:3)
创建一个为您的数据实现RandomAccess的ArrayList。在你的小时:分钟对象上实现一个比较器。将您的数组放入此列表中进行处理并对其进行排序。
以正常方式从当前时间抓取小时和分钟。
执行Collections.binarySearch()以获取匹配或接下来的列表项的索引并返回它(这是binarySearch的默认行为)。
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.GregorianCalendar;
import java.util.RandomAccess;
public class scratchpad {
public static void main(String [] args){
String[] hourMinuteStringArray = {"6:58","7:41","8:08","8:28","8:48","9:08","9:43","10:13","10:43","11:13","11:43","12:09","12:29","12:49","13:09","13:29","13:49","14:09","14:29","14:49","15:09","15:29","15:49","16:09","16:29","16:49","17:09","17:29","17:49","18:29","19:09","19:47","20:27","21:07","21:47","22:27"};
HourMinuteList hourMinuteList = convertHMStringArrayToHMArray(hourMinuteStringArray);
Collections.sort(hourMinuteList);
Calendar calendar = new GregorianCalendar();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
scratchpad s = new scratchpad();
HourMinute now = s.new HourMinute(hour,minute);
System.out.println("Now is " + hour + ":" + minute);
int nearestTimeIndex = Collections.binarySearch(hourMinuteList, now);
if(nearestTimeIndex < 0){
nearestTimeIndex = nearestTimeIndex * -1 -1;
}
System.out.println("Next time is " + ((HourMinute) hourMinuteList.get(nearestTimeIndex)).getHour() + ":" + ((HourMinute) hourMinuteList.get(nearestTimeIndex)).getMinuteString());
}
private static HourMinuteList convertHMStringArrayToHMArray(String[] times){
scratchpad s = new scratchpad();
HourMinuteList list = s.new HourMinuteList();
for(String time : times ){
String[] splitTime = time.split(":");
int hour = Integer.parseInt(splitTime[0]);
int minute = Integer.parseInt(splitTime[1]);
HourMinute hm = s.new HourMinute(hour,minute);
list.add(hm);
}
return list;
}
class HourMinuteList extends ArrayList implements RandomAccess{
}
class HourMinute implements Comparable {
int hour;
int minute;
public HourMinute(int hour, int minute) {
setHour(hour);
setMinute(minute);
}
int getMinute() {
return this.minute;
}
String getMinuteString(){
if(this.minute < 10){
return "0" + this.minute;
}else{
return "" + this.minute;
}
}
int getHour() {
return this.hour;
}
void setHour(int hour) {
this.hour = hour;
}
void setMinute(int minute) {
this.minute = minute;
}
@Override
public int compareTo(Object aThat) {
if (aThat instanceof HourMinute) {
HourMinute that = (HourMinute) aThat;
if (this.getHour() == that.getHour()) {
if (this.getMinute() > that.getMinute()) {
return 1;
} else if (this.getMinute() < that.getMinute()) {
return -1;
} else {
return 0;
}
} else if (this.getHour() > that.getHour()) {
return 1;
} else if (this.getHour() < that.getHour()) {
return -1;
} else {
return 0;
}
}
return 0;
}
}
}
答案 1 :(得分:1)
难道你不能这样做吗?从小时和分钟获取当前时间,并将它们转换为字符串,然后将它们与您的字符串进行比较。
如果你真的有很多数据,我希望你可以建立一个trie或类似的东西,并使用当前时间的完整字符串作为查找哪个条目是第一个符合你的标准的关键?