20240119
ccnaive 2024/1/19
# 1 找到type相同的进行排名
可用于进行同部门的排名
// 假设你的列表名为EntityDTO,已经填充了数据
List<EntityDTO> list = ...;
// 首先找到当前用户在列表中的对象
Optional<EntityDTO> currentUserOpt = list.stream()
.filter(dto -> "123456".equals(dto.getPhone()))
.findFirst();
if (currentUserOpt.isPresent()) {
EntityDTO currentUser = currentUserOpt.get();
// 对列表按部门名称和碳减排量降序排序
List<EntityDTO> sortedList = list.stream()
.sorted(Comparator.comparing(EntityDTO::getDepartmentName)
.thenComparing(EntityDTO::getCarbonTotal, Comparator.reverseOrder()))
.collect(Collectors.toList());
int deptRank = 1;
String currentDept = currentUser.getDepartmentName();
for (EntityDTO leader : sortedList) {
if (currentDept.equals(leader.getDepartmentName()) && !Objects.equals(currentUser, leader)) {
deptRank++;
} else if (currentDept.equals(leader.getDepartmentName())) {
// 当前用户所在位置就是部门排名
currentUser.setDeptRank(deptRank);
break;
}
}
} else {
System.out.println("当前用户未在列表中找到");
}
# 2 计算百分比 % percent
# 方法一
//总数
final double totalCarbon = dataDeptDTOS.stream().mapToDouble(EnterpriseDataDeptDTO::getCarbonTotal).sum();
DecimalFormat df = new DecimalFormat("0.00");
list.forEach(dto -> {
double percent = dto.getCarbonTotal() / totalCarbon * 100;
//计算占比
dto.setCarbonTotalPercent(Double.parseDouble(df.format(percent)));
});
# 方法二
return dataDeptDTOS.stream()
.peek(dto -> dto.setCarbonTotalPercent(ArithmeticUtils.mul(ArithmeticUtils.div(dto.getCarbonTotal(),totalCarbon),100,2)))// 保留两位小数
.collect(Collectors.toList());
# 随机生成手机号 generateMobile phone tel
public static String generateMobile() {
String[] prefixArray = {"130", "131", "132", "133", "134", "135", "136", "137", "138", "139", "147", "150", "151", "152", "153", "155", "156", "157", "158", "159", "186", "187", "188", "189"};
String prefix = prefixArray[new Random().nextInt(prefixArray.length)];
StringBuilder sb = new StringBuilder(prefix);
for (int i = 0; i < 8; i++) {
sb.append(new Random().nextInt(10));
}
return sb.toString();
}
# 随机生成姓名 generateName
public static String generateName() {
String[] firstNameArray = {"赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许", "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜", "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎", "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐", "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常", "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄", "和", "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧", "计", "伏", "成", "戴", "谈", "宋", "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "梁"};
String[] lastNameArray = {"丽", "敏", "芳", "静", "秀", "娟", "英", "华", "玲", "珍", "燕", "桂", "霞", "慧", "莉", "美", "琴", "婷", "红", "彩", "晶", "玉", "萍", "淑", "荣", "娜", "涛", "明", "超", "磊", "强", "勇", "军", "杰", "涵", "宇", "凯", "鑫", "晨", "昊", "健", "宁", "泽", "柏", "维", "文", "欣", "扬", "帆", "立", "程", "佳", "俊", "诚", "梓", "轩", "欢", "洋", "紫", "妍", "奕", "梅", "琳", "嘉", "海", "航", "鹏", "翔", "恒", "毅", "星", "博", "云", "琼", "晖", "晓", "峰", "颖", "韬", "瑾", "露", "思", "羽", "蕾", "青", "秉", "宸", "寒", "锦", "卓", "薇", "鸿", "展", "炜", "骏", "曼", "苗", "峻", "皓", "璐", "玫", "铭", "萌", "栋", "政", "琦", "岩", "珂", "哲", "灵", "桐", "璇", "峥", "菲", "淼", "涓", "希", "榕", "文峰", "铭", "旭"};
String firstName = firstNameArray[new Random().nextInt(firstNameArray.length)];
String lastName = lastNameArray[new Random().nextInt(lastNameArray.length)];
return firstName + lastName;
}
# 随机的身份证号码
public static String generateIdCard() {
String[] regionCodeArray = {"110100", "120100", "130100", "140100", "150100", "210100", "220100", "230100", "310100", "320100", "330100", "340100", "350100", "360100", "370100", "410100", "420100", "430100", "440100", "450100", "460100", "500100", "510100", "520100", "530100", "540100", "610100", "620100", "630100", "640100", "650100"};
String regionCode = regionCodeArray[new Random().nextInt(regionCodeArray.length)];
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, new Random().nextInt(60) + 1960);
calendar.set(Calendar.MONTH, new Random().nextInt(12));
calendar.set(Calendar.DAY_OF_MONTH, new Random().nextInt(28) + 1);
String birthDate = sdf.format(calendar.getTime());
StringBuilder sb = new StringBuilder(regionCode).append(birthDate);
for (int i = 0; i < 3; i++) {
sb.append(new Random().nextInt(10));
}
char[] chars = sb.toString().toCharArray();
int[] weightArray = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
String[] validateArray = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
int sum = 0;
for (int i = 0; i < weightArray.length; i++) {
sum += (chars[i] - '0') * weightArray[i];
}
sb.append(validateArray[sum % 11]);
return sb.toString();
}
# 随机的公司名称
public static String generateCompanyName() {
String[] prefixArray = {"北京", "上海", "广州", "深圳", "成都", "杭州", "南京", "武汉", "西安", "重庆", "青岛", "苏州", "天津", "长沙", "厦门", "沈阳", "大连", "福州", "济南", "无锡", "合肥", "南昌", "郑州", "石家庄", "哈尔滨", "长春", "南宁", "昆明", "海口", "兰州", "银川", "乌鲁木齐"};
String[] suffixArray = {"电子科技", "信息技术", "通信", "网络", "机械制造", "生物科技", "医药", "能源", "建筑设计", "文化传媒", "金融投资", "旅游酒店", "食品饮料", "物流运输", "环保工程", "化学材料", "地产置业", "公共服务", "体育运动", "教育培训", "家居用品", "汽车销售", "航空航天", "军工装备", "石油石化", "国际贸易", "法律服务", "人力资源", "安防监控", "软件开发", "游戏娱乐", "社交网络"};
String prefix = prefixArray[new Random().nextInt(prefixArray.length)];
String suffix = suffixArray[new Random().nextInt(suffixArray.length)];
return prefix + suffix + "有限公司";
}
# 随机的部门名称
public static String generateDepartmentName() {
String[] departmentArray = {"销售部", "研发部", "人力资源部", "财务部", "市场部", "采购部", "生产部", "行政部", "客服部", "品控部", "物流部", "安全环保部", "法务部", "信息技术部", "创新中心", "战略规划部", "投资部", "设计部", "培训部", "客户服务部", "运营管理部", "公关部", "供应链管理部", "质量控制部", "品牌推广部", "售后服务部"};
return departmentArray[new Random().nextInt(departmentArray.length)];
}
# double工具类 ArithmeticUtils
package com.dataojo.utils;
import java.math.BigDecimal;
/**
* @author Alan.hao
* @data 2023/05/11 22:25
* @description 用于高精确处理常用的数学运算
*/
public class ArithmeticUtils {
//默认除法运算精度
private static final int DEF_DIV_SCALE = 10;
/**
* 提供精确的加法运算
*
* @param v1 被加数
* @param v2 加数
* @return 两个参数的和
*/
public static double add(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}
/**
* 提供精确的加法运算
*
* @param v1 被加数
* @param v2 加数
* @return 两个参数的和
*/
public static BigDecimal add(String v1, String v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.add(b2);
}
/**
* 提供精确的加法运算
*
* @param v1 被加数
* @param v2 加数
* @param scale 保留scale 位小数
* @return 两个参数的和
*/
public static String add(String v1, String v2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.add(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
}
/**
* 提供精确的减法运算
*
* @param v1 被减数
* @param v2 减数
* @return 两个参数的差
*/
public static double sub(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
/**
* 提供精确的减法运算。
*
* @param v1 被减数
* @param v2 减数
* @return 两个参数的差
*/
public static BigDecimal sub(String v1, String v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.subtract(b2);
}
/**
* 提供精确的减法运算
*
* @param v1 被减数
* @param v2 减数
* @param scale 保留scale 位小数
* @return 两个参数的差
*/
public static String sub(String v1, String v2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.subtract(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
}
/**
* 提供精确的乘法运算
*
* @param v1 被乘数
* @param v2 乘数
* @return 两个参数的积
*/
public static double mul(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue();
}
/**
* 提供精确的乘法运算
*
* @param v1 被乘数
* @param v2 乘数
* @return 两个参数的积
*/
public static BigDecimal mul(String v1, String v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.multiply(b2);
}
/**
* 提供精确的乘法运算
*
* @param v1 被乘数
* @param v2 乘数
* @param scale 保留scale 位小数
* @return 两个参数的积
*/
public static double mul(double v1, double v2, int scale) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return round(b1.multiply(b2).doubleValue(), scale);
}
/**
* 提供精确的乘法运算
*
* @param v1 被乘数
* @param v2 乘数
* @param scale 保留scale 位小数
* @return 两个参数的积
*/
public static String mul(String v1, String v2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
}
/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
* 小数点以后10位,以后的数字四舍五入
*
* @param v1 被除数
* @param v2 除数
* @return 两个参数的商
*/
public static double div(double v1, double v2) {
return div(v1, v2, DEF_DIV_SCALE);
}
/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
* 定精度,以后的数字四舍五入
*
* @param v1 被除数
* @param v2 除数
* @param scale 表示表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public static double div(double v1, double v2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
* 定精度,以后的数字四舍五入
*
* @param v1 被除数
* @param v2 除数
* @param scale 表示需要精确到小数点以后几位
* @return 两个参数的商
*/
public static String div(String v1, String v2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v1);
return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toString();
}
/**
* 提供精确的小数位四舍五入处理
*
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public static double round(double v, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
return b.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供精确的小数位四舍五入处理
*
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public static String round(String v, int scale) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(v);
return b.setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
}
/**
* 取余数
*
* @param v1 被除数
* @param v2 除数
* @param scale 小数点后保留几位
* @return 余数
*/
public static String remainder(String v1, String v2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.remainder(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
}
/**
* 取余数 BigDecimal
*
* @param v1 被除数
* @param v2 除数
* @param scale 小数点后保留几位
* @return 余数
*/
public static BigDecimal remainder(BigDecimal v1, BigDecimal v2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
return v1.remainder(v2).setScale(scale, BigDecimal.ROUND_HALF_UP);
}
/**
* 比较大小
*
* @param v1 被比较数
* @param v2 比较数
* @return 如果v1 大于v2 则 返回true 否则false
*/
public static boolean compare(String v1, String v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
int bj = b1.compareTo(b2);
boolean res;
if (bj > 0){
res = true;
} else{
res = false;
}
return res;
}
}