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

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

0818b9ca8b590ca3270a3433284dd417.png

代码如下:

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> 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> srcDataList) throws Exception {

// 按userId createDate排序

Collections.sort(srcDataList, new Comparator>() {

public int compare(Map m1, Map 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> allMsgList = new ArrayList>();

List> rtnList = new ArrayList>();

Map firstMap = new HashMap();

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

allMsgList = new ArrayList>();

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 getMsgContent(Map msgMap) {

Map rtnMap = new HashMap();

rtnMap.put("createDate", msgMap.get("createDate"));

rtnMap.put("content", msgMap.get("content"));

return msgMap;

}

/**

* @Description: 按userId合并

*/

public void testMergeDataMethod2( List> srcDataList) throws Exception {

List> rtnList = new ArrayList>();

Map>> dataMap=new HashMap>>();

for (Map map : srcDataList) {

String key=map.get("userId");

if(dataMap.containsKey(key)){

List> dataList = dataMap.get(key);

dataList.add(getMsgContent(map));

}else{

List> dataList =new ArrayList>();

dataList.add(getMsgContent(map));

dataMap.put(key, dataList);

}

}

for (Entry>> entry: dataMap.entrySet()) {

Map firstMap = new HashMap();

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 json2Class(String json, Class cls) throws Exception {

ObjectMapper mapper = new ObjectMapper();

return mapper.readValue(json, cls);

}

}

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

0818b9ca8b590ca3270a3433284dd417.png

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

0818b9ca8b590ca3270a3433284dd417.png

欢迎提出更好的方法。

全文完。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值