Кто-нибудь знает библиотеку, которая будет манипулировать данными на основе временных интервалов? - PullRequest
1 голос
/ 31 июля 2011

Кто-нибудь знает библиотеку, которая может манипулировать / организовывать данные на основе временных интервалов?

Например:

  • У меня есть коллекция данных, которая отображается с помощью даты / времени на объект [Может быть что угодно, список несвязанных данных, строки, числа и т. Д.]
  • Мне бы хотелось, чтобы Коллекция была достаточно общей, чтобы она могла обрабатывать интервальные поиски, организации, слияния, пересечения, различия и интервальные изменения [т.е. коллекция реорганизует 15-минутный интервал, переходящий в 1-дневный интервал]

Я думал о том, чтобы написать один из них, но я бы не хотел изобретать велосипед.

Кроме того, последнее условие состоит в том, что я хотел бы, чтобы это было на Java.

Например:

У вас есть следующие данные:

  • 1/1/11 1:01 - «Боб вошел в комнату»
  • 1/1/11 12:01 - «Джерри вошел в комнату»
  • 1/1/11 1:31 - «Салли вошла в комнату»
  • 1/1/11 1:51 - «Хорхе вошел в комнату»
  • 1/1/11 2:01 - «Дилберт вошел в комнату»
  • 1/2/11 1:01 - «Боб вошел в комнату»
  • 1/3/11 12:01 - «Джерри вошел в комнату»
  • 1/2/11 1:31 - «Салли вошла в комнату»
  • 1/2/11 1:51 - «Хорхе вошел в комнату»

Все указанные здесь записи [в качестве значения с двумя значениями] будут помещены в коллекцию [т.е.]: add (Date, object) Однако при инициализации интервал будет установлен. [Т.е. 15 минут] Так что, если интервал был 15 минут [и запрашивается в течение определенного времени. Было бы производить:

  • 1/1/11 12: 00-12: 15
    • "Джерри вошел в комнату"
  • 1/1/11 1: 00-1: 15
    - «Боб вошел в комнату»
  • 1/1/11 1: 15-1: 30
  • 1/1/11 1: 30-1: 45

    • 1/1/11 1:31 - «Салли вошла в комнату» ....

    Если вы попытаетесь запросить 1/1/11 12:09, вы получите результаты за 01.01.11 12: 00-12: 15. Да, я понимаю, что есть крайние случаи, но это пример.

1 Ответ

4 голосов
/ 31 июля 2011

Вот эскиз TreeMap оболочки, которая в основном делает то, что показывает ваш пример:

public class CalendarMap<V> {

    private TreeMap<Calendar, V> map = new TreeMap<Calendar, V>();

    public void put(Calendar d, V v){
        map.put(d, v);
    }

    public void query(Calendar d, int intervalUnit, int intervalValue){
         DateFormat df = new SimpleDateFormat("MMM dd, yyyy");
         DateFormat tf = new SimpleDateFormat("HH:mm");

        // snap closest prior unit
        d.set(intervalUnit, (d.get(intervalUnit) / intervalValue)* intervalValue);
        Calendar next = new GregorianCalendar();
        next.setTime(d.getTime());
        next.add(intervalUnit, intervalValue);

        Calendar lastHit = null; // last hit

        while(d.before(map.lastKey())){
            SortedMap<Calendar, V> hits = map.subMap(d, true, next, false);
            if(!hits.isEmpty()){
                if(lastHit != null){
                    System.out.println(df.format(lastHit.getTime()) + " " + tf.format(lastHit.getTime()) + " - " + 
                            df.format(d.getTime()) + " " + tf.format(d.getTime()) + ": N/A");
                    lastHit = null;
                }
                System.out.println(df.format(d.getTime()) + " " + tf.format(d.getTime()) + "-" + tf.format(next.getTime()) + ":");
                for(Entry<Calendar, V> entry : hits.entrySet()){
                    System.out.println("  " + tf.format(entry.getKey().getTime()) + " - " + entry.getValue());
                }
            }else if(lastHit == null){
                lastHit = new GregorianCalendar();
                lastHit.setTime(d.getTime());
            }
            d.add(intervalUnit, intervalValue);
            next.add(intervalUnit, intervalValue);
        }
    }

    public static void main(String[] args){
        CalendarMap<String> map = new CalendarMap<String>();
        map.put(new GregorianCalendar(2011, 1, 1, 13, 1), "Bob entered the room");
        map.put(new GregorianCalendar(2011, 1, 1, 12, 1), "Jerry entered the room");
        map.put(new GregorianCalendar(2011, 1, 1, 13, 31), "Sally entered the room");
        map.put(new GregorianCalendar(2011, 1, 1, 14, 1), "Dilbert entered the room");
        map.put(new GregorianCalendar(2011, 1, 2, 13, 1), "Bob entered the room");
        map.put(new GregorianCalendar(2011, 1, 3, 12, 1), "Jerry entered the room");
        map.put(new GregorianCalendar(2011, 1, 2, 13, 31), "Sally entered the room");
        map.put(new GregorianCalendar(2011, 1, 2, 13, 51), "Jorge entered the room");

        map.query(new GregorianCalendar(2011, 1, 1, 12, 9), Calendar.MINUTE, 15);
    }

}

Это производит:

Feb 01, 2011 12:00-12:15:
  12:01 - Jerry entered the room
Feb 01, 2011 12:15 - Feb 01, 2011 13:00: N/A
Feb 01, 2011 13:00-13:15:
  13:01 - Bob entered the room
Feb 01, 2011 13:15 - Feb 01, 2011 13:30: N/A
Feb 01, 2011 13:30-13:45:
  13:31 - Sally entered the room
Feb 01, 2011 13:45 - Feb 01, 2011 14:00: N/A
Feb 01, 2011 14:00-14:15:
  14:01 - Dilbert entered the room
Feb 01, 2011 14:15 - Feb 02, 2011 13:00: N/A
Feb 02, 2011 13:00-13:15:
  13:01 - Bob entered the room
Feb 02, 2011 13:15 - Feb 02, 2011 13:30: N/A
Feb 02, 2011 13:30-13:45:
  13:31 - Sally entered the room
Feb 02, 2011 13:45-14:00:
  13:51 - Jorge entered the room
Feb 02, 2011 14:00 - Feb 03, 2011 12:00: N/A
Feb 03, 2011 12:00-12:15:
  12:01 - Jerry entered the room

Предположим, вместо этого вы выполните это:

map.query(new GregorianCalendar(2011, 1, 1, 12, 9), Calendar.HOUR, 1);

Тогда вывод:

Feb 01, 2011 12:09-13:09:
  13:01 - Bob entered the room
Feb 01, 2011 13:09-14:09:
  13:31 - Sally entered the room
  14:01 - Dilbert entered the room
Feb 01, 2011 14:09 - Feb 02, 2011 12:09: N/A
Feb 02, 2011 12:09-13:09:
  13:01 - Bob entered the room
Feb 02, 2011 13:09-14:09:
  13:31 - Sally entered the room
  13:51 - Jorge entered the room
Feb 02, 2011 14:09 - Feb 03, 2011 11:09: N/A
Feb 03, 2011 11:09-12:09:
  12:01 - Jerry entered the room
...