java里一个List对象里,想根据时间分组如何做呀?

晨曦遇晓 2020-07-07 03:45:18
今天有一个需求是把查出的数据按照一天24小时来进行展示,如下图:


我查询的数据查询出来了当天的数据,因为sql已经写了100+行了 所以想通过程序来控制分组 数据库的查询数据如下:


然后时间段的话是根据那个开卡时间来分组的 我想到的是拉姆达里面的
list.stream().collect(Collectors.groupingBy(对象::日期格式格式化之后按照小时));
这个地方之前都是一个对象的属性来分组做的,现在是根据小时来进行分组 一时不知道该怎写了,请求各路大神大佬帮小弟支支招 谢谢各位了!
...全文
4603 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨曦遇晓 2020-09-25
  • 打赏
  • 举报
回复
引用 10 楼 於菟. 的回复:
在使用时
Map<String, List<???>> collect = list.stream()
                    .collect(Collectors.groupingBy(item -> DateUtil.formatDate(item.Date())));
DateUtil是hutool中的工具类 实际情况可以自己写
好的 感谢 下次有这种情况就用这种方式做
晨曦遇晓 2020-09-25
  • 打赏
  • 举报
回复
引用 10 楼 於菟.的回复:
在使用时
Map<String, List<???>> collect = list.stream()
                    .collect(Collectors.groupingBy(item -> DateUtil.formatDate(item.Date())));
DateUtil是hutool中的工具类 实际情况可以自己写
嗯谢谢 那个工具知道但没咋用 到时研究一下
於菟. 2020-09-24
  • 打赏
  • 举报
回复
在使用时
Map<String, List<???>> collect = list.stream()
                    .collect(Collectors.groupingBy(item -> DateUtil.formatDate(item.Date())));
DateUtil是hutool中的工具类 实际情况可以自己写
梦在明月 2020-07-07
  • 打赏
  • 举报
回复
lamda表达式不利于维护 而且性能也就那样
梦在明月 2020-07-07
  • 打赏
  • 举报
回复
如果是Date类型就这样改一下
Map<String, List<Map<String, Object>>> groupedMap = new HashMap<>();

        FastDateFormat dateFormat = FastDateFormat.getInstance("yyyy-MM-dd HH");

        for (Map<String, Object> element : list) {
            Date time;
            if (element != null && (time = (Date)element.get("time")) != null) {
                String formatTime = dateFormat.format(time);
                if (groupedMap.containsKey(formatTime)) {
                    groupedMap.get(formatTime).add(element);
                } else {
                    List<Map<String, Object>> newList = new ArrayList<>();
                    newList.add(element);
                    groupedMap.put(formatTime, newList);
                }
            }
        }
        System.out.println(JSON.toJSONString(groupedMap));
晨曦遇晓 2020-07-07
  • 打赏
  • 举报
回复
引用 5 楼 阿萨德由 的回复:
Map<Integer, List<Map<String, Object>>> map = list.stream().collect(Collectors.groupingBy(p->((Date)p.get("k")).getHours()));
收藏 以后应该还会用到 感谢!
晨曦遇晓 2020-07-07
  • 打赏
  • 举报
回复
谢谢啦 的确是这样的 咱们的思路一样的 自己去实现,能满足需求就OK了
阿萨德由 2020-07-07
  • 打赏
  • 举报
回复 4
Map<Integer, List<Map<String, Object>>> map = list.stream().collect(Collectors.groupingBy(p->((Date)p.get("k")).getHours()));
梦在明月 2020-07-07
  • 打赏
  • 举报
回复
别想的太复杂 也不一定非要用lamda表达式 一个可以运行的不那么完美的程序 比一个不能运行的完美的程序更有价值

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

import com.alibaba.fastjson.JSON;

import org.apache.commons.lang.StringUtils;

public class Test {

    public static void main(String[] args) {
        List<Map<String, Object>> list = new ArrayList<>();

        Map<String, Object> map = new HashMap<>();
        map.put("time", "2020-07-07 08:48:55.000");

        Map<String, Object> map1 = new HashMap<>();
        map1.put("time", "2020-07-07 08:50:55.000");

        Map<String, Object> map2 = new HashMap<>();
        map2.put("time", "2020-07-07 09:50:55.000");

        Map<String, Object> map3 = new HashMap<>();
        map3.put("time", "2020-07-07 10:50:55.000");

        list.add(map);
        list.add(map1);
        list.add(map2);
        list.add(map3);

        Map<String, List<Map<String, Object>>> groupedMap = new HashMap<>();

        for (Map<String, Object> element : list) {
            String time;
            if (element != null && !StringUtils.isEmpty(time = (String)element.get("time"))) {
                time = time.substring(0, 14);
                if (groupedMap.containsKey(time)) {
                    groupedMap.get(time).add(element);
                } else {
                    List<Map<String, Object>> newList = new ArrayList<>();
                    newList.add(element);
                    groupedMap.put(time, newList);
                }
            }
        }
        System.out.println(JSON.toJSONString(groupedMap));
    }

}
晨曦遇晓 2020-07-07
  • 打赏
  • 举报
回复
Map<Integer,List<Map<String,Object>>>format=new HashMap<>();//key用来放每个小时,值放查询的数据 for (Map<String,Object> val:list){ Date opened=(Date)val.get("opened"); int hours = opened.getHours(); if(format.get(hours)==null){ List<Map<String,Object>> openedList=new ArrayList<>(); openedList.add(val); format.put(hours,openedList); }else{ List<Map<String, Object>> maps = format.get(hours); maps.add(val); } } 不会用拉姆达 后面自己写了一个根据时间小时进行分组的逻辑
晨曦遇晓 2020-07-07
  • 打赏
  • 举报
回复
因为我的查询返回的是一个List<Map<String,Object>>这种结构的 所以我不知道Collectors.groupingBy(?::?)这个地方该怎么写
阿萨德由 2020-07-07
  • 打赏
  • 举报
回复
groupingBy 里面把日期格式化成yyyy-MM-dd HH 不就行了

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧