Вот эскиз 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