在地图中存储具有日期的对象组

时间:2010-10-25 03:12:05

标签: java collections date map

我在一些日期发生了一组事件。每个事件都有一个Date字段。现在我想创建一个Map,其中对于每个Date(取自事件的所有日期),我将分配在该日期发生的事件列表。所以在伪代码中:

public Map<Date, List<Event>> function(List<Event> list){

    Date[]dates = new Date(list.len());

    for(Object o: list)
        add o.date to dates

    for(int i=0; i<dates.length; i++){
        create list of events with date=dates[i] (using some getDate())
        add to map(dates[i], list) 
    }

}

这是一种正确的思维方式吗?如果是:我如何创建具有特定日期的事件列表,然后将其添加到地图中?我刚刚开始收藏。

修改

所以我正在尝试使用hedrewness解决方案。最后一个问题是如何检索具有所需日期的事件。所以我在我的地图上创建一个迭代器,但接下来呢?在python中它很容易,但我怎样才能在Java中获得带有date = date'的对象?

private String getItems(Date date){
    String ret = "";
    // DatesSortedMap is my previously built map and it works properly
    Iterator i = this.DatesSortedMap.entrySet().iterator();

    while( i.hasNext() ){
        //how I can get to the object while having iterator ?
        if(object.date = date)
            ret += object;
    }

    return ret;
}

3 个答案:

答案 0 :(得分:1)

以下是我对此方法进行编码的方法:

public Map<Date, List<Event>> function(List<Event> list){
    Map<Date, List<Event>> sortedEvents = new HashMap<Date, List<Event>>();
    for(Event event : list) {
        Date eventDate = event.getDate();
        if(!sortedEvent.containsKey(eventDate)) {
            sortedEvent.put(eventDate, new ArrayList<Event>());
        }
        sortedEvent.get(eventDate).add(event);
    }
}

或伪造的代码:

Loop through events
   Get event date
   If Map does not contain member for event date
      Create new member for event date
   End if
   Add event for given event date
End Loop

一个重要的警告是将日期作为哈希键进行比较。应考虑时区,毫秒精度等事项。

修改

迭代返回值:

Map<Date, List<Event>> map = // call sort function
for(Map.Entry<Date, List<Event>> entry : map.entrySet()) {
    Date date = entry.getKey();
    List<Event> events = entry.getValue();
}

答案 1 :(得分:1)

如果其他人需要这样的东西,那么现在(Java8 +)可以完成,例如,这样(事件属性created是LocalDateTime)。示例的TreeMap(如果需要排序)。 Collectors.toCollection(ArrayList::new))可能会更改为Collectors.toList(不保证列表类型)。

List<Event> events ...

Map<LocalDate, List<Event>> = events.stream().collect(
            Collectors.groupingBy(
                event -> event.getCreated().toLocalDate(),
                TreeMap::new,
                Collectors.mapping(event -> event, Collectors.toCollection(ArrayList::new))
            )
        );

也可以使用Collectors.groupingBy(event -> event.getCreated().toLocalDate()),但您将无法指定地图的类型

答案 2 :(得分:0)

你大部分都在那里。您可以遍历事件,而不是遍历日期,在完成时将每个事件添加到正确的“桶”中。