集合的拆箱与装箱

该博客讨论了如何处理包含Map对象的List集合,通过比较id和name字段进行去重,并合并相同id和name对应的Map中'ltemsList'字段的元素。在遍历过程中,避免对集合进行修改,确保了遍历的正确性。博客提到了注意事项,如避免在遍历中使用foreach,以及在合并元素时固定数组长度以防止死循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合的拆箱与装箱

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王钧石的技术博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值