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;
}
}
}
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/17654821.html