工作中遇到需要合并相同用户的内容,数据如下:
代码如下:
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);
}
}
方法一使用了排序,可以得到合并的时间段。结果如下:
方法二简单易于理解,结果如下:
欢迎提出更好的方法。
全文完。