集合的拆箱与装箱
需求概述:
给定一个集合:
List<Map<String,Object>> arr
其中Map集合中存储3个对象分别如下例:
{“id”,“1234x”} ----------编号
{“name”,“张三”} ----------姓名
{[{“ltemsList”,[“男”,“20岁”,“175”]},{“other”,[“aaa”,“bbb”,“ccc”}} ----------详情
其中arr集合中多个Map之间可能会存在id ,name完全相同的Map,如下例:
{“id”,“1234x”} ----------编号
{“name”,“张三”} ----------姓名
{[{“ltemsList”,[“未婚”,“汉族”,“中共党员”},{“other”,[“aaa”,“bbb”,“ccc”}]} ----------详情
要求,定义一个方法可以将arr集合中具有相同id,name的Map集合进行去重,只保留一条Map,并将其他相同Map集合中的ItemsList集合中的元素合并至一起,并返回新的集合。
即如下:
{“id”,“1234x”} ----------编号
{“name”,“张三”} ----------姓名
{[{“ltemsList”,[“男”,“20岁”,“175”,“未婚”,“汉族”,“中共党员”]},{“other”,[“aaa”,“bbb”,“ccc”}]} --详情
实现代码
public static List<Map<String,Object>> getReloadData( List<Map<String,Object>> arr){
//将整理后的数据重新添加到list集合中
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
//定义一个boolean值,以此来决定是否要添加当前元素
boolean flag = true;
for(int i=0;i<arr.size();i++){
//目标元素拆箱
Map<String,Object> relMap = arr.get(i);
String id = relMap.get("id").toString();
String name = relMap.get("name").toString();
//不回头比较
for(int j=0;j<arr.size-i;j++){
//比较元素拆箱
Map<String,Object> mrelMap = arr.get(j);
String mid = mrelMap.get("id").toString();
String mname =mrelMap.get("name").toString();
//满足比较条件
if(id.equals(mid)&&name.equals(mname)){
//目标元素拆箱
List<Object> listInfo = (List<Object>)relMap.get("ltemsList");
//比较元素拆箱
List<Object> mlistInfo = (List<Object>)mrelMap.get("ltemsList");
//重新整合装箱(将mlistInfo中的list集合元素拼接到listInfo中的list集合元素中)
//固定数组的长度
int num=mlistInfo.size();
for(int k=0;k<num;k++){
Map<String,Object> contentMap =(Map<String,Object>) mlistInfo.get(k);
if(mlistMap.containKey("content")){
//装箱
listInfo.add(contentMap);
}
}
}
}
//去重(判断是否重复录入)
for(Map map:list){
Map<String,Object> putMap = map;
String cid = putMap.get("id").toString();
String cname =putMap.get("name").toString();
if(id.equals(cid)&&name.equals(cname)){
fllag=false;
}
}
//将整合后的数据装配到新List集合中
if(flag){
list.add(relMap);
}
}
return list;
}
需要注意的点:
1.在数组遍历同时,对数组内元素进行修改、添加或删除操作时,要用普通的for循环,不可使用foreach,foreach可以应用在仅判断而不进行修改的场景中使用.
2.在数组添加元素操作时,要注意固定数组的长度,其中for循环中不可使用mlistInfo.size()方法作为判断条件,原因是数组每增加一个元素时,mlistInfo.size()长度也随之增加1,此时for循环由于mlistInfo.size()的叠加变成了死循环.因此要使用int num=mlistInfo.size();将数组的长度固定.