import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.TreeSet;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import com.google.common.collect.Lists;
/**
*
* @Description:
* @Author: ScreenJxp
* @Date: 2023年06月19日 15:05
* @version: V1.0
*/
public class UserTest {
private String uname;
private String uuid;
private String status;
public UserTest(String uname, String uuid, String status) {
this.uname = uname;
this.uuid = uuid;
this.status = status;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public static void main(String[] args) {
//表决状态 (同意0 否决1 再议2)
List<UserTest> all = Lists.newArrayList();
all.add(new UserTest("张三", "1", "0"));
all.add(new UserTest("李四", "2", "0"));
all.add(new UserTest("王五", "3", "1"));
//一部分数据
List<UserTest> another = Lists.newArrayList();
another.add(new UserTest("张三2", "1", "0"));
another.add(new UserTest("李四", "2", "0"));
another.add(new UserTest("刘三", "2", "0"));
//求两个集合的差集
List<UserTest> user = all.stream().filter(item -> !another.stream().map(e -> e.getUname() + e.getUuid()).collect(Collectors.toList())
.contains(item.getUname() + item.getUuid())).collect(Collectors.toList());
System.out.println("集合差集");
for (UserTest userTest : user) {
System.out.println(userTest.getUname() + "--" + userTest.getUuid());
}
//求两个集合的交集
List<UserTest> userJoin = CollectionUtils.emptyIfNull(all).stream().filter(item -> CollectionUtils.emptyIfNull(another).stream()
.map(e -> e.getUname() + e.getUuid()).collect(Collectors.toList()).contains(item.getUname() + item.getUuid()))
.collect(Collectors.toList());
System.out.println("集合交集");
for (UserTest userTest : userJoin) {
System.out.println(userTest.getUname() + "--" + userTest.getUuid());
}
//求两个集合的并集
all.addAll(another);
// 按姓名分组
Map<String, List<UserTest>> userGroup = all.stream().collect(Collectors.groupingBy(e -> e.getUname()));
System.out.println("集合的分组");
for (String s : userGroup.keySet()) {
System.out.println("-----" + s);
for (UserTest userTest : userGroup.get(s)) {
System.out.println(userTest.getUname() + "--" + userTest.getUuid());
}
}
//按姓名分组统计数量
final Map<String, Long> collect1 = all.stream().collect(Collectors.groupingBy(e -> e.getUname(), Collectors.counting()));
System.out.println("集合的分组统计");
for (Map.Entry<String, Long> longEntry : collect1.entrySet()) {
System.out.println(longEntry.getKey() + "---" + longEntry.getValue());
}
//按姓名分组统计数量
final Map<String, Integer> collect2 = all.stream().collect(Collectors.groupingBy(e -> e.getUname(), Collectors.summingInt(e -> 1)));
System.out.println("集合的分组统计2");
for (Map.Entry<String, Integer> longEntry : collect2.entrySet()) {
System.out.println(longEntry.getKey() + "---" + longEntry.getValue());
}
//map转list //在.map里面构造数据 return什么数据就转成什么类型的list
List<String> collect = userGroup.entrySet().stream().map(item -> {
return "用户信息" + item.getKey();
}).collect(Collectors.toList());
System.out.println("map转list");
for (String s : collect) {
System.out.println(s);
}
//集合转list
List<String> userIdList = all.stream().map(e -> e.getUuid()).collect(Collectors.toList());
//集合转map
//(k1,k2)->k2 避免键重复 k1-取第一个数据;k2-取最后一条数据
Map<String, UserTest> userIdMap = all.stream().collect(Collectors.toMap(e -> e.getUuid(), e -> e, (k1, k2) -> k2));
System.out.println("集合转map");
for (String s : userIdMap.keySet()) {
System.out.println(s + "---" + userIdMap.get(s).getUname());
}
//根据userId 和name 去重
List<UserTest> unionAll = all.stream()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(e -> e.getUname() + e.getUuid()))),
ArrayList::new))
.stream().sorted(Comparator.comparing(UserTest::getUuid)).collect(Collectors.toList());
System.out.println("集合的并集");
for (UserTest userTest : unionAll) {
System.out.println(userTest.getUname() + "--" + userTest.getUuid());
}
}
/***
* 表决结果最终裁定
* @param sourceList
* @return
*/
public static String getDecideStatus(List<UserTest> sourceList) {
String status = "2";
Integer totalPer = sourceList.size();
//求状态比例 表决状态 (同意0 否决1 再议2)
Map<String, List<UserTest>> groupInfo = CollectionUtils.emptyIfNull(sourceList).stream().collect(Collectors.groupingBy(e -> e.getStatus()));
//同意人数
Integer agreePer = groupInfo.containsKey("0") ? groupInfo.get("0").size() : 0;
//否决人数
Integer vetoPer = groupInfo.containsKey("1") ? groupInfo.get("1").size() : 0;
//再议人数
Integer againPer = groupInfo.containsKey("2") ? groupInfo.get("2").size() : 0;
//同意比例
BigDecimal agreePercent = new BigDecimal(agreePer).divide(new BigDecimal(totalPer), 3, BigDecimal.ROUND_HALF_UP);
BigDecimal vetoPercent = new BigDecimal(vetoPer).divide(new BigDecimal(totalPer), 3, BigDecimal.ROUND_HALF_UP);
//三分之二及以上的人同意流程同意
if (agreePercent.compareTo(new BigDecimal("0.667")) >= 0) {
status = "0";
} else if (vetoPercent.compareTo(new BigDecimal("0.333")) > 0) {
//三分之1以上的人否决表决状态为否决
status = "1";
}
return status;
}
}
Java集合处理求交集,差集
于 2023-06-26 14:17:59 首次发布