Использование раз на платформе Android - PullRequest
2 голосов
/ 22 апреля 2010

У меня много информации о времени в формате чч: мм, и мне было интересно, есть ли хороший способ взять эту информацию и сравнить ее с текущим временем.Скажем, у меня есть список времени за день, и я хочу выяснить, какое время в этом массиве строк является первым, которое еще не прошло в этот день.

Я смотрел на 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>

Ответы [ 2 ]

3 голосов
/ 22 апреля 2010

Создайте ArrayList, который реализует RandomAccess для ваших данных. Реализуйте Comparator на вашем объекте hour: minute. Поместите ваш массив в этот список для обработки и сортируйте его.

Как обычно, выберите часы и минуты из текущего времени.

Выполните 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 голос
/ 22 апреля 2010

Не могли бы вы просто сделать это по-другому? Получить текущее время из календаря в часах и минутах и ​​преобразовать их в строки, а затем сравнить их с вашими строками.

Если у вас действительно много данных, я ожидаю, что вы могли бы создать trie или что-то подобное, и использовать полную строку текущего времени в качестве ключа для поиска, какая запись первой соответствует вашей критерии?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...