Lsit<Map>中的Map去重以及执行效率测试

最近朋友问到我关于List<Map>中根据map的一个属性去重的问题,刚刚写了一个例子,给大家分享一下,应该还有更好的办法,如果有好的建议或问题,可以留言告诉我。

现在已有优化解点击 点击打开链接


import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Test2 {
	public static void main(String[] args) {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		Map map1 = new HashMap();
		map1.put("ppdz", "12341");
		map1.put("name", "啦啦1");

		Map map2 = new HashMap();
		map2.put("ppdz", "12341");
		map2.put("name", "啦啦2");

		Map map3 = new HashMap();
		map3.put("ppdz", "123");
		map3.put("name", "啦啦3");

		Map map4 = new HashMap();
		map4.put("ppdz", "1234");
		map4.put("name", "啦啦4");

		Map map5 = new HashMap();
		map5.put("ppdz", "1235");
		map5.put("name", "啦啦5");

		Map map6 = new HashMap();
		map6.put("ppdz", "12346");
		map6.put("name", "啦啦6");

		Map map7 = new HashMap();
		map7.put("ppdz", "123");
		map7.put("name", "啦啦7");

		Map map8 = new HashMap();
		map8.put("ppdz", "12345");
		map8.put("name", "啦啦8");

		Map map9 = new HashMap();
		map9.put("ppdz", "12345");
		map9.put("name", "啦啦9");

		list.add(map1);
		list.add(map2);
		list.add(map3);
		list.add(map4);
		list.add(map5);
		list.add(map6);
		list.add(map7);
		list.add(map8);
		list.add(map9);
		// 新建set集合用于标记重复的id
		Set arr = new HashSet();
		// 新建集合用于接收去重过的Map
		List<Map<String, Object>> newlist = new ArrayList<Map<String, Object>>();
		// 外层循环从第一个开始遍历
		for (int i = 0; i < list.size(); i++) {
			// 判断i值是否存在于arr内,如果存在说明之前比较过排除这个循环
			if (arr.contains(i)) {
				continue;
			}
			// 获取map对象
			Map m1 = list.get(i);
			// 把map对象存放进新的list集合中
			newlist.add(m1);
			// 内层循环从下一个map开始获取比较
			for (int j = i + 1; j < list.size(); j++) {
				// 获取map对象
				Map m2 = list.get(j);
				// 比较m1和m2各自键为ppdz的值,如果相等说明这个为重复项
				if (m1.get("ppdz").equals(m2.get("ppdz"))) {
					// 纪录重复项的下标到arr中,防止重复判断
					arr.add(j);
					continue;
				}
			}
		}
		// 遍历得到结果
		for (Map m : newlist) {
			System.out.println(m.get("ppdz") + "    " + m.get("name"));
		}
	}
}

运行结果如图:

这个是保留前面的,如果需要保留后面的把循环倒过来应该就可以了。

下面来测试一下这个的执行效率

插入1w条不同的map

	
		for(int i=0;i<10000;i++){
			Map map = new HashMap();
			map.put("ppdz", i);
			map.put("name", "啦啦9");
			list.add(map);
		}

执行结果是1656ms

下面插入10w条不同的map测试

	for(int i=0;i<100000;i++){
			Map map = new HashMap();
			map.put("ppdz", i);
			map.put("name", "啦啦9");
			list.add(map);
		}

结果使158s多 很慢

下面测试一下共100w条记录,并且每一万条记录是相等的

	for(int i=0;i<100000;i++){
			Map map = new HashMap();
			map.put("ppdz", "1");
			map.put("name", "啦啦9");
			list.add(map);
		}
		for(int i=0;i<100000;i++){
			Map map = new HashMap();
			map.put("ppdz", "2");
			map.put("name", "啦啦9");
			list.add(map);
		}
		for(int i=0;i<100000;i++){
			Map map = new HashMap();
			map.put("ppdz", "3");
			map.put("name", "啦啦9");
			list.add(map);
		}
		for(int i=0;i<100000;i++){
			Map map = new HashMap();
			map.put("ppdz", "4");
			map.put("name", "啦啦9");
			list.add(map);
		}
		for(int i=0;i<100000;i++){
			Map map = new HashMap();
			map.put("ppdz", "5");
			map.put("name", "啦啦9");
			list.add(map);
		}
		for(int i=0;i<100000;i++){
			Map map = new HashMap();
			map.put("ppdz", "6");
			map.put("name", "啦啦9");
			list.add(map);
		}
		for(int i=0;i<100000;i++){
			Map map = new HashMap();
			map.put("ppdz", "7");
			map.put("name", "啦啦9");
			list.add(map);
		}
		for(int i=0;i<100000;i++){
			Map map = new HashMap();
			map.put("ppdz", "8");
			map.put("name", "啦啦9");
			list.add(map);
		}
		for(int i=0;i<100000;i++){
			Map map = new HashMap();
			map.put("ppdz", "9");
			map.put("name", "啦啦9");
			list.add(map);
		}
		for(int i=0;i<100000;i++){
			Map map = new HashMap();
			map.put("ppdz", "10");
			map.put("name", "啦啦9");
			list.add(map);
		}

结果使589ms,很意外,挺快的!

所以如果你需要去除的重复量比较大,完全可以这样用!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值