java List<Map>去重的两种实现方式

1.情景展示

在实际开发中,有时我们需要对List集合当中的元素进行去重。

而List当中的元素往往是对象,我们需要根据对象当中的某个或者多个属性值进行判断,才能去重。

如何实现?

2.具体分析

在java当中,Set集合当中的元素具有唯一性。

利用这一特性,我们可以完成去List集合当中的元素进行去重。

同样地,当List集合当中包含的是java实体类时,这种方式,同样适用。

3.解决方案

以List<Map>为例,需判断key=mediid和key=medicode二者都相同时,视为重复数据。

如何实现?

方式一:Set去重

public static void main(String[] args) {
    
    List<Map<String, String>> jkItemList = new ArrayList<>(5);
    Map m = new HashMap<String, String>(3);
    m.put("mediid", "608542");
    m.put("medicode", "000000001");
    m.put("mediname", "测试");
    jkItemList.add(m);
    m = new HashMap<String, String>(3);
    m.put("mediid", "608543");// mediid不同
    m.put("medicode", "000000001");
    m.put("mediname", "测试");
    jkItemList.add(m);
    m = new HashMap<String, String>(3);
    m.put("mediid", "608542");
    m.put("medicode", "000000002");// medicode不同
    m.put("mediname", "测试");
    jkItemList.add(m);
    // 重复数据,只有这一条
    m = new HashMap<String, String>(3);// mediid和medicode相同
    m.put("mediid", "608542");
    m.put("medicode", "000000001");
    m.put("mediname", "测试4");
    jkItemList.add(m);
    m = new HashMap<String, String>(3);// mediname不同
    m.put("mediid", "608545");
    m.put("medicode", "000000005");
    m.put("mediname", "测试5");
    jkItemList.add(m);
    
    System.out.println(jkItemList);
    
    
    // 2023年8月24日14:29:30
    // Step1:对接口返回项目列表进行去重
    // 去重依据:mediid+medicode,联合去重
    String mediid; 
    String medicode;

    // 由于Set集合只能容纳一个值,所以,我们可以将联合去重,拼成一个值
    List<String> tempList = new ArrayList<>(jkItemList.size());
    for (Map<String, String> map : jkItemList) {
        mediid = map.get("mediid");
        medicode = map.get("medicode");
        // 合二为一
        tempList.add(mediid + "," + medicode);
    }
    
    // 利用Set的唯一性进行去重
    Set<String> set = new TreeSet<>();
    set.addAll(tempList);
    // Set转List
    List<String> tempList2 = new ArrayList<>(set);
    String mediid2; 
    String medicode2;
    // 去重后的List
    List<Map<String, String>> jkItemList2 = new ArrayList<>(tempList2.size());
    
    for (String strs : tempList2) {
        mediid2 = strs.split(",")[0];
        medicode2 = strs.split(",")[1];
        
        for (Map<String, String> map : jkItemList) {
            // 
            mediid = map.get("mediid");
            medicode = map.get("medicode");
            if (mediid.equals(mediid2) && medicode.equals(medicode2)) {
                jkItemList2.add(map);
                // 终止本轮循环(避免重复插入的关键)
                break;
            }
        }
        
    }
    
    System.out.println(jkItemList2);
    
}

执行结果:

[{mediname=测试, mediid=608542, medicode=000000001}, {mediname=测试, mediid=608543, medicode=000000001}, {mediname=测试, mediid=608542, medicode=000000002}, {mediname=测试4, mediid=608542, medicode=000000001}, {mediname=测试5, mediid=608545, medicode=000000005}]
[{mediname=测试, mediid=608542, medicode=000000001}, {mediname=测试, mediid=608542, medicode=000000002}, {mediname=测试, mediid=608543, medicode=000000001}, {mediname=测试5, mediid=608545, medicode=000000005}]

方式二:java8去重

// 去重依据:mediid+medicode,联合去重
String mediid; 
String medicode;

// 由于Set集合只能容纳一个值,所以,我们可以将联合去重,拼成一个值
List<String> tempList = new ArrayList<>(jkItemList.size());
for (Map<String, String> map : jkItemList) {
	mediid = map.get("mediid");
	medicode = map.get("medicode");
	// 合二为一
	tempList.add(mediid + "," + medicode);
}

// 利用java8进行去重
List<String> tempList2 = tempList.stream().distinct().collect(Collectors.toList());

String mediid2; 
String medicode2;
// 去重后的List
List<Map<String, String>> jkItemList2 = new ArrayList<>(jkItemList.size());

for (String strs : tempList2) {
	mediid2 = strs.split(",")[0];
	medicode2 = strs.split(",")[1];
	
	for (Map<String, String> map : jkItemList) {
		// 
		mediid = map.get("mediid");
		medicode = map.get("medicode");
		if (mediid.equals(mediid2) && medicode.equals(medicode2)) {
			jkItemList2.add(map);
			// 终止本轮循环(避免重复插入的关键)
			break;
		}
	}
	
}

 

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

posted @ 2023-08-24 17:54  Marydon  阅读(4127)  评论(0编辑  收藏  举报