集合的拆箱与装箱

集合的拆箱与装箱

需求概述:
给定一个集合:
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();将数组的长度固定.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王钧石的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值