1

有谁知道可以根据时间间隔操作/组织数据的库?

例如:

  • 我有一组按日期/时间映射到对象的数据[可以是任何东西,不相关数据的列表、字符串、数字等]
  • 我希望 Collection 足够通用,以便它可以处理间隔搜索、组织、合并、交叉点、差异和间隔更改 [即,该集合将重新组织 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 - “豪尔赫进入房间”

此处所述的所有条目 [作为 2 值数据] 将进入集合 [ie]: 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,您将获得 1/1/11 12:00-12:15 的结果。是的,我意识到有边缘情况,但这是一个例子。

4

1 回答 1

4

这是一个包装器的草图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);
    }

}

这会产生:

2011年2月1日12:00-12:15:
  12:01 - 杰瑞进入房间
2011 年 2 月 1 日 12:15 - 2011 年 2 月 1 日 13:00:不适用
2011年2月1日13:00-13:15:
  13:01 - Bob 进入房间
2011 年 2 月 1 日 13:15 - 2011 年 2 月 1 日 13:30:不适用
2011年2月1日13:30-13:45:
  13:31 - 莎莉进入房间
2011 年 2 月 1 日 13:45 - 2011 年 2 月 1 日 14:00:不适用
2011年2月1日14:00-14:15:
  14:01 - 呆伯特进入房间
2011 年 2 月 1 日 14:15 - 2011 年 2 月 2 日 13:00:不适用
2011年2月2日13:00-13:15:
  13:01 - Bob 进入房间
2011 年 2 月 2 日 13:15 - 2011 年 2 月 2 日 13:30:不适用
2011年2月2日13:30-13:45:
  13:31 - 莎莉进入房间
2011年2月2日13:45-14:00:
  13:51 - 豪尔赫进入房间
2011 年 2 月 2 日 14:00 - 2011 年 2 月 3 日 12:00:不适用
2011年2月3日12:00-12:15:
  12:01 - 杰瑞进入房间

假设您执行以下操作:

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

然后输出是:

2011年2月1日12:09-13:09:
  13:01 - Bob 进入房间
2011年2月1日13:09-14:09:
  13:31 - 莎莉进入房间
  14:01 - 呆伯特进入房间
2011 年 2 月 1 日 14:09 - 2011 年 2 月 2 日 12:09:不适用
2011年2月2日12:09-13:09:
  13:01 - Bob 进入房间
2011年2月2日13:09-14:09:
  13:31 - 莎莉进入房间
  13:51 - 豪尔赫进入房间
2011 年 2 月 2 日 14:09 - 2011 年 2 月 3 日 11:09:不适用
2011年2月3日11:09-12:09:
  12:01 - 杰瑞进入房间
于 2011-07-30T23:00:47.313 回答