`
53873039oycg
  • 浏览: 824131 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[简单]代码片段_java合并userId相同数据

    博客分类:
  • java
阅读更多

       工作中遇到需要合并相同用户的内容,数据如下:

      

      代码如下:

      

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);
	}
	
}

   方法一使用了排序,可以得到合并的时间段。结果如下:

  

     方法二简单易于理解,结果如下:

    

        欢迎提出更好的方法。

        全文完。

 

  • 大小: 21.1 KB
  • 大小: 50.6 KB
  • 大小: 33.7 KB
分享到:
评论

相关推荐

    java天气数据接口

    Xfire 调用气象数据接口 java调用天气 java气象数据接口 很好的气象数据接口 里面的UserId需要从www.36wu.com从新申请。

    如何用java代码写数据库数据

    如何在用java代码修改数据库数据: Java写数据库数据的前提: 首先要Java与数据库相连接。如有不懂得可以看我的之前的博文。 用Java代码修改数据 如一个方法(根据id 修改年龄大小):void xg(int id){ Connection ...

    TokenGenerator_java:生成令牌的代码

    使用SDK访问好视通云通信平台服务需要使用Token,该项目提供生成Token的Java语言代码。 关于Token鉴权的具体细节,参考 使用方式 你应该在服务器程序中使用对应的代码生成Token,将Token下发给客户端登录好视通云...

    学生信息管理系统java课程设计(含源代码)(1).doc

    学生信息管理系统java课程设计(含源代码) JAVA程序设计 课程设计报告 课 题: 学生信息管理系统 姓 名: 学 号: 同组姓名: 专业班级: 指导教师: 设计时间: 目 录 一、系统描述 2 1、需要实现的功能 3 2、设计...

    web_server_uid:从Ruby中的Apache的mod_uid nginx的ngx_http_userid_module解析并表示UID令牌

    使用这些模块,您可以在网站的每个访问者登录之前为其生成唯一的ID,并将其添加到所有记录的数据中,从数据库行到应用程序日志再到Web服务器日志,再到您可能需要的其他任何数据。 为每个访问者生成唯一的ID并不是...

    移植到 Scala-Js 的 一些简单游戏_PHP_代码_下载

    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完整工程

    JAVA连接FileMaker完整工程 包函FileMaker数据库Java连接驱动 修改工程中的FileMaker安装地址就 可以用JAVA操作FileMaker 数据库 Driver d = (Driver)Class.forName("com.filemaker.jdbc.Driver").newInstance(); ...

    VhallUploadKit_java:微吼上传录播并生成回放工具

    VhallUploadKit_java微吼上传录播并生成回放工具一、集成方式:复制demo/libs中的jar到工程中,add to BuildPath;二、调用方法:1、构建VhallUploadKit:util = VhallUploadKit.getInstance();2、使用微吼APP_KEY,...

    网上商店 java 源代码

    网上商店 java 源代码 在线购物系统设计一、三、软件代码组织方式设计 项目名\ WEB-INF\ web.xml classes\ global\ 放数据库访问等工具类 businesses\ 业务逻辑处理 login\ 登录 cart\ 购物车 ...

    java分页int pageSize:每页显示多少条记录

    首先要定义四个变量: int pageSize:每页显示多少条记录 ...select top 3 * from users where userId not in(select top 3 userId from users) (select top 3 userId from users):选出这个表的前三条 前面再选三条

    webrtc_server_java:P2P Webrtc VideoConference 视频通话 视频会议

    Override 配合 使用的一套服务器java版本 实现基本的信令收发,配合Android端实现基本的... "userID":"userId", "avatar":"...jpg" } } 邀请加入房间 # 服务器负责转发 { "eventName":"__invite", "data":{

    java后台实现用list接收重复的对象属性

    java实现后台用list接收前台重复的name属性的值 接收重复属性 后台数组接收前台重复的name

    1 亿条淘宝用户行为数据分析项目(代码+文档)

    技术栈:清洗 hive + 分析 hive + 可视化 echarts 处理方式:离线模式 数据集文件请在csdn资源中需找下载(是...或者也可在阿里云数据集自行下载:https://tianchi.aliyun.com/dataset/dataDetail?dataId=649&userId=1

    Struts1.2+Tomcat5.5网上购物系统

    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,...

    Java 连接多种数据库代码参考

    Jdbc连接各种数据库代码方法大全 1、Oracle8/8i/9i数据库(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为...

    java代码获取myeclipse注册码.txt

    java代码获取myeclipse注册码 package util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /* 如何注册myeclipse 1、菜单myeclipse----&gt;subscription...

    taobao-sdk-java-auto_1479188381469-20191021.jar

    钉钉 Java SDK 钉钉官方提供了统一的SDK,使用SDK可以便捷的调用服务端API。注意:此SDK包含原有TOP接口,原有TOP接口可以继续正常调用,没有影响。下面是使用SDK调用API的请求示例: JAVA: DingTalkClient client...

    2420 万条用户播放艺术家歌曲的信息_可用于数据挖掘和分析

    主要的数据集在文件user_artist_data.txt 中,它包含141 000 个用户和 160 万个艺术家,记录了约2420 万条用户播放艺术家歌曲的信息,其中包括播放次数信息。 数据集在artist_data.txt 文件中给出了每个艺术家的ID ...

    Java和Redis实现一个简单的热搜功能

    每个用户都有自己的有序集合,通过ZSET_PREFIX + userId来区分不同用户的热搜数据。每个搜索词都与一个得分相关联,该得分由函数getScore计算得出。新搜索词得分为1,旧搜索词得分为0。这个得分代表了搜索的频率和...

Global site tag (gtag.js) - Google Analytics