工作中遇到需要合并相同用户的内容,数据如下:
代码如下:
import java.text.ParseException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; import org.codehaus.jackson.JsonParser; import org.codehaus.jackson.map.ObjectMapper; public class 相同数据合并_S3_Test { public static void main(String[] args) throws Exception { 相同数据合并_S3_Test t=new 相同数据合并_S3_Test(); t.testMerge(); } public void testMerge() throws Exception{ String str="[ { \"createDate\": \"2015-05-04 17:05:20\", \"content\": \"测试\", \"userId\": \"545271289\" }, { \"createDate\": \"2015-05-04 19:05:20\", \"content\": \"测试5\", \"userId\": \"545271209\" }, { \"createDate\": \"2015-05-04 16:05:20\", \"content\": \"测试2\", \"userId\": \"545271289\" }, { \"createDate\": \"2015-05-04 19:05:20\", \"content\": \"测试7\", \"userId\": \"545271219\" }, { \"createDate\": \"2015-05-04 15:05:20\", \"content\": \"测试3\", \"userId\": \"545271289\" }, { \"createDate\": \"2015-05-04 11:05:20\", \"content\": \"测试4\", \"userId\": \"545271289\" }, { \"createDate\": \"2015-05-04 18:05:20\", \"content\": \"测试6\", \"userId\": \"545271219\" }, { \"createDate\": \"2015-05-04 19:05:20\", \"content\": \"测试5\", \"userId\": \"545271289\" } ] "; List<Map<String,String>> srcDataList=JacksonHelper.json2Class(str, List.class); System.out.println(JacksonHelper.obj2Json(srcDataList)); if(srcDataList.isEmpty()){ return ; } testMergeDataMethod(srcDataList); testMergeDataMethod2(srcDataList); } /** * @Description: 按userId合并,按createDate排序 */ public void testMergeDataMethod( List<Map<String,String>> srcDataList) throws Exception { // 按userId createDate排序 Collections.sort(srcDataList, new Comparator<Map<String, String>>() { public int compare(Map<String, String> m1, Map<String, String> m2) { int destCmp = StringUtils.trimToEmpty(m1.get("userId")).compareTo(StringUtils.trimToEmpty(m2.get("userId"))); if (destCmp == 0) { try { return DateUtils.parseDate(StringUtils.trim(m1.get("createDate")),"yyyy-MM-dd HH:mm:ss").compareTo( DateUtils.parseDate(StringUtils.trim(m2.get("createDate")),"yyyy-MM-dd HH:mm:ss")); } catch (ParseException e) { return 0; } } return destCmp; } }); List<Map<String, String>> allMsgList = new ArrayList<Map<String, String>>(); List<Map<String, Object>> rtnList = new ArrayList<Map<String, Object>>(); Map<String, Object> firstMap = new HashMap<String, Object>(); String userId = srcDataList.get(0).get("userId"); String lastCreateDateStr = srcDataList.get(0).get("createDate"); firstMap.put("userId", userId); firstMap.put("startDate", srcDataList.get(0).get("createDate")); allMsgList.add(getMsgContent(srcDataList.get(0))); for (int i = 1, len = srcDataList.size(); i < len; i++) { String currDestId = srcDataList.get(i).get("userId"); if (currDestId.equals(userId)) { allMsgList.add(getMsgContent(srcDataList.get(i))); lastCreateDateStr = srcDataList.get(i).get("createDate"); } else { firstMap.put("endDate", lastCreateDateStr); firstMap.put("msg", allMsgList); rtnList.add(firstMap); firstMap = new HashMap<String, Object>(); allMsgList = new ArrayList<Map<String, String>>(); userId = srcDataList.get(i).get("userId"); lastCreateDateStr = srcDataList.get(i).get("createDate"); firstMap.put("userId", userId); firstMap.put("startDate", lastCreateDateStr); allMsgList.add(getMsgContent(srcDataList.get(i))); } } firstMap.put("endDate", lastCreateDateStr); firstMap.put("msg", allMsgList); rtnList.add(firstMap); System.out.println(JacksonHelper.obj2Json(rtnList)); } public Map<String, String> getMsgContent(Map<String, String> msgMap) { Map<String, Object> rtnMap = new HashMap<String, Object>(); rtnMap.put("createDate", msgMap.get("createDate")); rtnMap.put("content", msgMap.get("content")); return msgMap; } /** * @Description: 按userId合并 */ public void testMergeDataMethod2( List<Map<String,String>> srcDataList) throws Exception { List<Map<String, Object>> rtnList = new ArrayList<Map<String, Object>>(); Map<String,List<Map<String, String>>> dataMap=new HashMap<String, List<Map<String,String>>>(); for (Map<String, String> map : srcDataList) { String key=map.get("userId"); if(dataMap.containsKey(key)){ List<Map<String, String>> dataList = dataMap.get(key); dataList.add(getMsgContent(map)); }else{ List<Map<String, String>> dataList =new ArrayList<Map<String,String>>(); dataList.add(getMsgContent(map)); dataMap.put(key, dataList); } } for (Entry<String, List<Map<String, String>>> entry: dataMap.entrySet()) { Map<String, Object> firstMap = new HashMap<String, Object>(); firstMap.put("userId", entry.getKey()); firstMap.put("msg", entry.getValue()); rtnList.add(firstMap); } System.out.println(JacksonHelper.obj2Json(rtnList)); } } class JacksonHelper { private static ObjectMapper mapper = new ObjectMapper(); static{ mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS,true); } public static String obj2Json(Object obj) throws Exception { return mapper.writeValueAsString(obj); } public static <T> T json2Class(String json, Class<T> cls) throws Exception { ObjectMapper mapper = new ObjectMapper(); return mapper.readValue(json, cls); } }
方法一使用了排序,可以得到合并的时间段。结果如下:
方法二简单易于理解,结果如下:
欢迎提出更好的方法。
全文完。
相关推荐
Xfire 调用气象数据接口 java调用天气 java气象数据接口 很好的气象数据接口 里面的UserId需要从www.36wu.com从新申请。
如何在用java代码修改数据库数据: Java写数据库数据的前提: 首先要Java与数据库相连接。如有不懂得可以看我的之前的博文。 用Java代码修改数据 如一个方法(根据id 修改年龄大小):void xg(int id){ Connection ...
使用SDK访问好视通云通信平台服务需要使用Token,该项目提供生成Token的Java语言代码。 关于Token鉴权的具体细节,参考 使用方式 你应该在服务器程序中使用对应的代码生成Token,将Token下发给客户端登录好视通云...
学生信息管理系统java课程设计(含源代码) JAVA程序设计 课程设计报告 课 题: 学生信息管理系统 姓 名: 学 号: 同组姓名: 专业班级: 指导教师: 设计时间: 目 录 一、系统描述 2 1、需要实现的功能 3 2、设计...
使用这些模块,您可以在网站的每个访问者登录之前为其生成唯一的ID,并将其添加到所有记录的数据中,从数据库行到应用程序日志再到Web服务器日志,再到您可能需要的其他任何数据。 为每个访问者生成唯一的ID并不是...
php 上的简单 websocket ...chat3 - 聊天(可以通过 clientId、userId 或 PHPSESSID 发送个人消息的单个守护程序 + 脚本) 游戏 - 简单的实时游戏 game2 - 实时游戏 更多详情、使用方法,请下载后阅读README.md文件
近400多万条数据,可以做大数据分析的案例和练习,可以作为推荐系统的学习 字段(id, userid,age,gender,item_id, behavior_type, item_category, date, province)(序号,用户ID,性别,商品ID,用户行为,商品...
JAVA连接FileMaker完整工程 包函FileMaker数据库Java连接驱动 修改工程中的FileMaker安装地址就 可以用JAVA操作FileMaker 数据库 Driver d = (Driver)Class.forName("com.filemaker.jdbc.Driver").newInstance(); ...
VhallUploadKit_java微吼上传录播并生成回放工具一、集成方式:复制demo/libs中的jar到工程中,add to BuildPath;二、调用方法:1、构建VhallUploadKit:util = VhallUploadKit.getInstance();2、使用微吼APP_KEY,...
网上商店 java 源代码 在线购物系统设计一、三、软件代码组织方式设计 项目名\ WEB-INF\ web.xml classes\ global\ 放数据库访问等工具类 businesses\ 业务逻辑处理 login\ 登录 cart\ 购物车 ...
首先要定义四个变量: int pageSize:每页显示多少条记录 ...select top 3 * from users where userId not in(select top 3 userId from users) (select top 3 userId from users):选出这个表的前三条 前面再选三条
Override 配合 使用的一套服务器java版本 实现基本的信令收发,配合Android端实现基本的... "userID":"userId", "avatar":"...jpg" } } 邀请加入房间 # 服务器负责转发 { "eventName":"__invite", "data":{
java实现后台用list接收前台重复的name属性的值 接收重复属性 后台数组接收前台重复的name
技术栈:清洗 hive + 分析 hive + 可视化 echarts 处理方式:离线模式 数据集文件请在csdn资源中需找下载(是...或者也可在阿里云数据集自行下载:https://tianchi.aliyun.com/dataset/dataDetail?dataId=649&userId=1
Constraint FK_userID Foreign Key(userID) References USER_INFO(userID), Constraint FK_productID Foreign Key(productID) References PRODUCT_INFO(productID) ); Insert into BOUGHT_PRODUCT(userID,...
Jdbc连接各种数据库代码方法大全 1、Oracle8/8i/9i数据库(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为...
java代码获取myeclipse注册码 package util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /* 如何注册myeclipse 1、菜单myeclipse---->subscription...
钉钉 Java SDK 钉钉官方提供了统一的SDK,使用SDK可以便捷的调用服务端API。注意:此SDK包含原有TOP接口,原有TOP接口可以继续正常调用,没有影响。下面是使用SDK调用API的请求示例: JAVA: DingTalkClient client...
主要的数据集在文件user_artist_data.txt 中,它包含141 000 个用户和 160 万个艺术家,记录了约2420 万条用户播放艺术家歌曲的信息,其中包括播放次数信息。 数据集在artist_data.txt 文件中给出了每个艺术家的ID ...
每个用户都有自己的有序集合,通过ZSET_PREFIX + userId来区分不同用户的热搜数据。每个搜索词都与一个得分相关联,该得分由函数getScore计算得出。新搜索词得分为1,旧搜索词得分为0。这个得分代表了搜索的频率和...