工作中遇到需要合并相同用户的内容,数据如下:
代码如下:
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); } }
方法一使用了排序,可以得到合并的时间段。结果如下:
方法二简单易于理解,结果如下:
欢迎提出更好的方法。
全文完。
相关推荐
除此之外,JAX-RS还支持数据绑定,如JSR 310(Java时间API)和Jackson库用于JSON序列化和反序列化,简化了数据交换的过程。同时,可以使用Filter和Interceptor来实现跨切面的功能,如日志记录、权限验证等。 除了...
在Web应用开发中,JSP(JavaServer Pages)通常用于展示视图,而业务逻辑和数据访问则应该被分离出来以提高代码的可维护性和可扩展性。DAO(Data Access Object)设计模式就是解决这一问题的有效方式,它将数据库...
### Eclipse/MyEclipse Java代码模板使用详解 #### 引言 在进行Java开发时,我们经常会遇到一些频繁使用的代码片段。为了提高编码效率、减少重复劳动,Eclipse 和 MyEclipse 提供了代码模板的功能,允许用户自定义...
同时,通过将这些通用功能封装在工具类中,我们可以避免在多个类或模块中重复实现相同的功能,遵循了DRY(Don't Repeat Yourself)原则,提高了代码的可维护性。 在使用这些工具类时,开发者需要注意几点: 1. 对于...
在压缩包中的`webweatertest`文件,可能是测试代码或者示例,用于演示如何在Java项目中实际调用这个天气数据接口。这个文件可以帮助开发者快速上手,理解如何与接口进行交互,包括设置请求参数、发送请求和解析响应...
本资料"restful_java_jax-rs_2_0-master"是针对Java开发者学习RESTful服务的一个重要资源,尤其是对于那些想要深入理解JAX-RS 2.0规范的开发者来说,它是必备的学习材料。这个压缩包包含的源代码能够帮助你实践并...
本文将深入探讨如何使用Java代码在SpringBoot中实现动态数据源的功能。 首先,我们需要理解动态数据源的基本概念。动态数据源是指在运行时能够根据业务逻辑或用户需求动态地选择和切换数据源的技术。在SpringBoot中...
Java编程通过匹配合并数据实例解析(数据预处理) Java编程通过匹配合并数据实例解析(数据预处理)是指在数据预处理阶段,将不同的数据源合并到一起,以便更好地进行数据分析和处理。在本文中,我们将介绍如何使用...
Jersey提供了一系列的注解和API,使得开发者可以通过简单的代码实现RESTful服务。例如,使用`@Path`注解定义资源路径,`@GET`、`@POST`等注解指定HTTP方法,`@PathParam`、`@QueryParam`、`@HeaderParam`等注解用于...
《Java Servlet 3.1详解:特性与实战》 Servlet技术是Java Web开发中的核心组件,用于处理HTTP请求和响应。随着技术的发展,Servlet规范也不断进化,Servlet 3.1作为其重要的版本,引入了许多增强功能和优化,极大...
PaloAlto
使用SDK访问好视通云通信平台服务需要使用Token,该项目提供生成Token的Java语言代码。 关于Token鉴权的具体细节,参考 使用方式 你应该在服务器程序中使用对应的代码生成Token,将Token下发给客户端登录好视通云...
JSONAPI 是一种规范,用于构建高效、可读性高的 API,尤其适合于Web服务与客户端进行数据交换。在这个基本示例中,我们将探讨如何在Ruby on Rails框架中实现JSONAPI,以及如何与Java客户端进行交互。 一、Ruby on ...
在Java编程中,Redis是一个非常流行的键值存储系统,常用于缓存、消息队列以及数据持久化等场景。在处理大量数据时,分页查询是必不可少的技术,它能有效地提高用户体验并降低服务器压力。本篇文章将深入探讨如何在...
这里我们将深入探讨如何使用Java代码来操作数据库,特别是如何修改、添加、删除和查询数据。以下是一些关键知识点: 1. **Java与数据库连接**: 在Java中,我们通常使用JDBC(Java Database Connectivity)API来...
下面是一个简单的Java代码片段,展示了如何在JSP页面中实现分页功能: ```java // 设置每页显示的记录数量 int pageSize = 3; // 默认显示第一页 int pageNow = 1; // 数据库中总的记录数量,通过查询获得 int ...
使用这些模块,您可以在网站的每个访问者登录之前为其生成唯一的ID,并将其添加到所有记录的数据中,从数据库行到应用程序日志再到Web服务器日志,再到您可能需要的其他任何数据。 为每个访问者生成唯一的ID并不是...
### Java实训教程知识点详解 #### 一、SpringMVC数据校验概述 SpringMVC作为Spring框架中的一个重要组成部分,主要用于构建Web应用。随着版本的不断更新,SpringMVC提供了更为强大的功能来支持Web应用程序的开发。...
描述部分提到本文主要介绍了Java记住密码功能的实现代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下。这说明了本文的内容是实用的、易懂的,并且具有很高的参考价值。 标签解释 标签...
标题与描述均聚焦于“SQL_SERVER_和_ACCESS、EXCEL的数据转换技巧”,这明确指出了文章的核心主题,即探讨如何在SQL Server、Microsoft Access以及Microsoft Excel之间进行数据转换的策略与技术。以下是对这一主题的...