如何在Java中将会议数据按对应日历时间分组映射?
解决会议按日期分组的问题
嘿,我来帮你搞定这个按日期分组会议的需求!你的代码已经搭好了基础框架,只需要补充分组的核心逻辑就行,核心思路是把每个会议的时间转换为「当天零点的Calendar实例」作为Key,这样同一天的会议自然会被分到同一个Key下面。
核心步骤说明
- 遍历所有会议模型,取出每个会议的毫秒级开始时间
- 将毫秒时间转换为Calendar实例,并用你已经写好的
setMidnight方法把它设置为当天零点(这样同一天的不同时间会变成同一个Calendar实例,保证分组正确) - 检查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
相关产品推荐
相关产品推荐

