You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中将会议数据按对应日历时间分组映射?

解决会议按日期分组的问题

嘿,我来帮你搞定这个按日期分组会议的需求!你的代码已经搭好了基础框架,只需要补充分组的核心逻辑就行,核心思路是把每个会议的时间转换为「当天零点的Calendar实例」作为Key,这样同一天的会议自然会被分到同一个Key下面。

核心步骤说明

  1. 遍历所有会议模型,取出每个会议的毫秒级开始时间
  2. 将毫秒时间转换为Calendar实例,并用你已经写好的setMidnight方法把它设置为当天零点(这样同一天的不同时间会变成同一个Calendar实例,保证分组正确)
  3. 检查HashMap中是否存在这个零点Calendar的Key:
    • 不存在的话,新建一个List存放当前会议,再把Key和List存入Map
    • 存在的话,直接把当前会议加到对应的List里

修改后的完整代码

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;

public class Meeting {
    public static void main(String[] args) {
        ArrayList<Long> dateinmiliis = new ArrayList<>();
        dateinmiliis.add(1512538200000L);
        dateinmiliis.add(1516235400000L);
        dateinmiliis.add(1516318200000L);
        dateinmiliis.add(1516397400000L);
        dateinmiliis.add(1516404600000L);
        dateinmiliis.add(1516498200000L);
        dateinmiliis.add(1516573800000L);
        dateinmiliis.add(1516663800000L);
        
        ArrayList<String> title = new ArrayList<>();
        title.add("December 6 meeting");
        title.add("18th meeting");
        title.add("19th meeting");
        title.add("20th first meeting");
        title.add("20th second meeting");
        title.add("21th meeting");
        title.add("21th second meeting");
        title.add("23rd meeting");
        
        ArrayList<MeetingModel> listOfmeeting = new ArrayList<>();
        for (int i = 0; i < title.size(); i++) {
            MeetingModel model = new MeetingModel();
            model.setStarttime(dateinmiliis.get(i));
            model.setTitle(title.get(i));
            listOfmeeting.add(model);
        }
        
        HashMap<Calendar, List<MeetingModel>> mapEvents = new HashMap<>();
        
        // 核心分组逻辑开始
        for (MeetingModel meeting : listOfmeeting) {
            // 为每个会议新建Calendar实例,避免复用导致的Key覆盖
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(meeting.getStarttime());
            // 设置为当天零点,保证同一天的会议Key相同
            setMidnight(calendar);
            
            // 检查Map中是否已有该Key
            if (!mapEvents.containsKey(calendar)) {
                mapEvents.put(calendar, new ArrayList<>());
            }
            // 将当前会议加入对应日期的List
            mapEvents.get(calendar).add(meeting);
        }
        // 核心分组逻辑结束
        
        // 测试输出,验证分组结果
        for (Calendar key : mapEvents.keySet()) {
            System.out.println("日期:" + key.getTime());
            for (MeetingModel m : mapEvents.get(key)) {
                System.out.println(" - " + m.getTitle());
            }
        }
    }
    
    static void setMidnight(Calendar calendar) {
        if (calendar != null) {
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
        }
    }
}

// 假设你的MeetingModel类是这样的(需要getter方法)
class MeetingModel {
    private Long starttime;
    private String title;
    
    public Long getStarttime() {
        return starttime;
    }
    
    public void setStarttime(Long starttime) {
        this.starttime = starttime;
    }
    
    public String getTitle() {
        return title;
    }
    
    public void setTitle(String title) {
        this.title = title;
    }
}

额外优化(Java 8+ 可选)

如果你的项目使用Java 8及以上版本,可以用Stream API更简洁地实现分组,代码会更优雅:

// 替换上面的核心分组逻辑,一行搞定
HashMap<Calendar, List<MeetingModel>> mapEvents = listOfmeeting.stream()
    .collect(Collectors.groupingBy(meeting -> {
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(meeting.getStarttime());
        setMidnight(cal);
        return cal;
    }));

注意:使用这个方式需要导入java.util.stream.Collectors包。

关键注意点

  • 必须为每个会议新建Calendar实例:Calendar是可变对象,如果复用同一个实例,会导致之前的Key被修改,分组完全错误。
  • setMidnight方法的作用:确保同一个自然日的所有会议都对应同一个Calendar Key,因为Calendar的equals方法会比较所有时间字段,零点的Calendar实例才会被判定为相等。

内容的提问来源于stack exchange,提问作者Manoj Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:48:42