在某些常见的图形、表格统计系统中,往往需要计算同比、环比等等,下面是自己整理的常用统计工具类方法


import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.*;
import java.util.regex.Pattern;/*** 统计项目的工具类** @author linmin**/
public class StatisticsUtils {/*** 判断一个字符串是不是全是数字的正则匹配规则*/private static Pattern pattern = Pattern.compile("^-?\\d+(\\.\\d+)?$");/*** 日志记录对象*/private static final Logger logger = LoggerFactory.getLogger(StatisticsUtils.class);private StatisticsUtils() {}/*** 同比,环比均可用* 获取增长率,保留四位小数* 增长率=(本月数-上月数)/上月数×100%* @param lastCount    上月的数据* @param currentCount 本月的数据* @return float*/public static String getGrowthRate(double lastCount, double currentCount) {double growthRate;if (lastCount == 0) {growthRate = 1;} else {growthRate = (float) (currentCount - lastCount) / lastCount;}//保留4为小数return String.format("%.4f", growthRate);}/*** 获取占比* @param molecular  分子* @param denominator 分母* @return  返回占比*/public static String getProportion(double molecular, double denominator) {String proportion;if (denominator == 0) {proportion = "";} else {double pro = molecular / denominator;proportion = String.format("%.4f", pro);}return proportion;}/***  把对象转换成双精度数据* @param object object* @return 双精度数据*/public static double getObjectToDouble(Object object) {String str = String.valueOf(object).trim();if (StringUtils.isEmpty(str)) {return 0;}if (!isNumber(str)) {throw new NumberFormatException("字符串里面不全是数字,不能转换");}return Double.parseDouble(str);}/***  把对象转换成字符串* @param object object* @return  String*/public static String getObjectToString(Object object) {if(object==null){return "";}return String.valueOf(object).trim();}/*** 判断一个字符串是不是全是数字* @param string 判断是不是全数字的字符串* @return 布尔值*/private static boolean isNumber(String string) {if (StringUtils.isEmpty(string)) {return false;}return pattern.matcher(string).matches();}/*** 获取昨年和今年同比的数据* @param thisYearList 今年的数据* @param lastYearList 昨年的数据* @return 同比数据集合*/public static List<Map<String, Object>> getYearOnYearList(List<Map<String, Object>> thisYearList, List<Map<String, Object>> lastYearList) {//住院总费用同比增长集合List<Map<String, Object>> yearOnYearZngeList = new ArrayList<>();for (int i = 0; i < thisYearList.size(); i++) {//获取今年每月对应的收入mapMap<String, Object> thisYearMap = thisYearList.get(i);//获取去年每月对应的收入mapMap<String, Object> lastYearMap = lastYearList.get(i);Object thisYearCost = thisYearMap.get("thisYearCost");Object lastYearCost = lastYearMap.get("lastYearCost");double thisYearCount = StatisticsUtils.getObjectToDouble(thisYearCost);double lastYearCount = StatisticsUtils.getObjectToDouble(lastYearCost);//根据去年和今年的总收入算出对应的增长率String growthRate = StatisticsUtils.getGrowthRate(lastYearCount, thisYearCount);//时间横坐标 1月、 2月……String dateAbscissa = (String) thisYearMap.get("dateAbscissa");//每次计算得出的增长率mapMap<String, Object> yearOnYearMap = new HashMap<>(16);//吧每月对应的增长率放入mapyearOnYearMap.put("dateAbscissa", dateAbscissa);yearOnYearMap.put("thisYearCount",thisYearCount);yearOnYearMap.put("lastYearCount",lastYearCount);yearOnYearMap.put("growthRate", growthRate);yearOnYearZngeList.add(yearOnYearMap);}return yearOnYearZngeList;}/*** 获取双精度数据的后几位数据* @param d     双精度数据* @param digit 需要保留小数点后几位* @return 返回处理后的字符串对象*/public static String getNumberFormatByDecimalPlaces(double d, int digit) {NumberFormat numberInstance = NumberFormat.getNumberInstance();numberInstance.setMaximumFractionDigits(digit);return numberInstance.format(d);}/*** 获取上月环比日期* @param date 本月日期* @param formatPattern  日期的匹配格式* @return  获取上月环比日期*/private static String  getLastMouthDate( String date,String formatPattern){Date lastMouth=new Date();try {SimpleDateFormat format = new SimpleDateFormat(formatPattern);Date currentDate = format.parse(date);Calendar c = Calendar.getInstance();c.setTime(currentDate);c.add(Calendar.MONTH, -1);lastMouth = c.getTime();} catch (ParseException e) {logger.error("获取环比日期异常",e);}return format(lastMouth,formatPattern);}/*** 获取去年同比日期* @param date 今年对应的日期* @param formatPattern  日期的匹配格式* @return 获取去年同比日期*/public static String  getLastYearDate( String date,String formatPattern){Date lastYear=new Date();try {SimpleDateFormat format = new SimpleDateFormat(formatPattern);Date currentDate = format.parse(date);Calendar c = Calendar.getInstance();c.setTime(currentDate);c.add(Calendar.YEAR, -1);lastYear = c.getTime();} catch (ParseException e) {logger.error("获取同比日期异常",e);}return format(lastYear,formatPattern);}/*** 格式化时间成字符串* @param time  需要格式化的时间* @param formatPattern  日期的匹配格式* @return 返回对应格式的时间字符串*/private static String format(Date time,String formatPattern) {SimpleDateFormat sdf = new SimpleDateFormat(formatPattern);return sdf.format(time);}/*** 获取上期环比搜索条件(移除以前的时间参数值)* @param searchConditionalParameters 搜索条件map* @param startDate 开始时间* @param endDate 结束时间*/public  static  Map<String, Object>  replaceLastMouthConditional( Map<String, Object> searchConditionalParameters,String startDate ,String endDate ){searchConditionalParameters.remove(Constant.START_DATE.getDescribe());searchConditionalParameters.remove(Constant.END_DATE.getDescribe());searchConditionalParameters.put(Constant.START_DATE.getDescribe(),StatisticsUtils.getLastMouthDate(startDate,Constant.DATE_FORMAT_PATTERN.getDescribe()));searchConditionalParameters.put(Constant.END_DATE.getDescribe(),StatisticsUtils.getLastMouthDate(endDate,Constant.DATE_FORMAT_PATTERN.getDescribe()));return searchConditionalParameters;}/*** 获去年同比搜索条件(移除以前的时间参数值)* @param searchConditionalParameters 搜索条件map* @param startDate 开始时间* @param endDate 结束时间*/public  static  Map<String, Object> replaceLastYearConditional( Map<String, Object> searchConditionalParameters,String startDate ,String endDate ){searchConditionalParameters.remove(Constant.START_DATE.getDescribe());searchConditionalParameters.remove(Constant.END_DATE.getDescribe());searchConditionalParameters.put(Constant.START_DATE.getDescribe(),StatisticsUtils.getLastYearDate(startDate,Constant.DATE_FORMAT_PATTERN.getDescribe()));searchConditionalParameters.put(Constant.END_DATE.getDescribe(),StatisticsUtils.getLastYearDate(endDate,Constant.DATE_FORMAT_PATTERN.getDescribe()));return searchConditionalParameters;}/*** 获取开始时间,如果没有传入时间,则默认当年的1月1日* @param request  客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息* @return 开始时间字符串*/public static  String getStartDate(HttpServletRequest request){String startDate = request.getParameter(Constant.START_DATE.getDescribe());LocalDate localDate=LocalDate.now();if (StringUtils.isEmpty(startDate)){startDate=localDate.getYear()+"-01-01";}return startDate;}/*** 获取结束时间,如果没有传入时间,则默认当前时间* @param request  客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息* @return 结束时间字符串*/public static  String getEndDate(HttpServletRequest request){String endDate = request.getParameter(Constant.END_DATE.getDescribe());LocalDate localDate=LocalDate.now();if (StringUtils.isEmpty(endDate)){endDate=localDate.toString();}return endDate;}}

java统计系统工具类相关推荐

  1. java 系统工具类 查询内存 CPU 系统基本信息 SysInfoUtils

    java 系统工具类 查询内存 CPU 系统基本信息 SysInfoUtils maven依赖 <dependency><groupId>com.github.oshi< ...

  2. java自学——arrary工具类和双色球案例

    java自学--arrary工具类 定义 常用方法 代码示例 双色球案例 双色彩票的玩法 分析 实现步骤 代码示例 定义 arrary工具类:用来操作数组(比如排序和搜索)的各种方法 使用这个方法需要 ...

  3. java轻量级并行工具类_16 个超级实用的 Java 工具类

    原标题:16 个超级实用的 Java 工具类 源 /juejin 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名, ...

  4. Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类

    Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类 =========================== ©Copyright 蕃薯耀 2017年9月22日 http://fansh ...

  5. Java使用hutool工具类发送http请求

    Java使用hutool工具类发送网络请求 引入jar包 pom.xml添加以下hutool依赖 <dependency><groupId>cn.hutool</grou ...

  6. Java封装OkHttp3工具类

    点击关注公众号,Java干货及时送达  作者:如漩涡 https://blog.csdn.net/m0_37701381 Java封装OkHttp3工具类,适用于Java后端开发者 说实在话,用过挺多 ...

  7. UrlUtils工具类,Java URL工具类,Java URL链接工具类

    UrlUtils工具类,Java URL工具类,Java URL链接工具类 >>>>>>>>>>>>>>>&g ...

  8. java时间日期工具类_java日期处理工具类

    java日期处理工具类 import java.text.DecimalFormat; import java.text.ParsePosition; import java.text.SimpleD ...

  9. java 日期处理工具类_Java日期处理工具类DateUtils详解

    本文实例为大家分享了Java日期处理工具类DateUtils的具体代码,供大家参考,具体内容如下 import java.sql.Timestamp; import java.text.ParseEx ...

  10. java downloadfile_FileDownload.java:文件下载工具类

    FileDownload.java:文件下载工具类 2017-04-25·Mr.Xia 4489 次浏览 文件下载功能的工具类 JavaWeb工具类目录 [http://baike.xsoftlab. ...

最新文章

  1. C#拾遗系列(4):索引器
  2. 事件监听器 java_Java实现一个简单的事件监听器
  3. STL常用的算术和生成算法
  4. 零基础学HTML5和CSS3前端开发第一课
  5. iOS 关于关键字高亮
  6. Android之解决Android10.0通过热点名字和密码连接指定热点网络不能通信问题(2种解决办法)
  7. 在玩客云上部署code-server
  8. 滴滴定制网约车D1即将登陆长沙 市民12月中可叫到
  9. Codeforces Round #772 (Div. 2) D. Infinite Set (动态规划+思维)
  10. C语言大型程序的项目管理与实现
  11. 程序员表白源码集合打包带走
  12. android 美拍加表情,怎么把美拍加表情
  13. macos 废纸篓强制删除文件文件夹
  14. 视频号怎么赚钱?视频号有什么功能?
  15. Redis的基本使用
  16. Linux tail命令的使用方法详解
  17. golang 设置goproxy代理的小细节,适用于go module下载超时,阿里云镜像go module下载超时
  18. 【js】判断是否包含数字
  19. 解决稻香老农无组件上传类在文件上传时当文件名中含中文单双引号取不到正确的文件名的方案
  20. 知识是不会让人自满的。 少年,只有名和利才会。

热门文章

  1. md5加解密工具 java_MD5解密加密工具类
  2. 转载--32个鲜为人知的自学网站
  3. 2019上半年系统集成项目管理工程师真题与答案
  4. IE11设置默认以IE8的方式解析
  5. usb调试助手_米卓同屏助手 | 刷短视频必备,一键打通“任督二脉”,双端
  6. 计算机操作系统第三次作业,操作系统第三次作业参考答案
  7. 第6节 蒙特卡罗模拟计算欧式期权价格
  8. html5翻牌小游戏源码,html5记忆翻牌游戏实现思路及代码
  9. Windowsserver 2012R2 部署pxe启动安装windows系统
  10. 应用服务器配置测算及计算公式