【问题标题】:Storing group of objects with Dates in a Map在地图中存储带有日期的对象组
【发布时间】:2010-10-25 03:12:05
【问题描述】:

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

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) 
    }

}

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

编辑

所以我正在尝试使用 hisdrewness 的解决方案。最后一个问题是如何检索具有所需日期的事件。所以我在我的地图上创建了一个迭代器,但是接下来呢?在 python 中这很容易,但是如何在 Java 中“获取日期=日期的对象”?

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;
}

【问题讨论】:

    标签: java collections date map


    【解决方案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 -&gt; event.getCreated().toLocalDate()) 也可以使用,但您无法指定地图的类型

    【讨论】:

      【解决方案2】:

      这是我将如何编写此方法的代码:

      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();
      }
      

      【讨论】:

        【解决方案3】:

        你大部分时间都在那里。除了遍历日期之外,您还可以遍历事件,在执行过程中将每个事件添加到正确的“存储桶”中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-21
          • 1970-01-01
          • 1970-01-01
          • 2014-04-22
          • 2017-07-25
          相关资源
          最近更新 更多