20240119

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;
    }
}