Java数学运算工具类
2021/10/11 11:14:20
本文主要是介绍Java数学运算工具类,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
package com.clinicalresearch.core.utils; import com.clinicalresearch.core.dto.NearDto; import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.Multimap; import org.apache.commons.lang.StringUtils; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class MathUtils { /** * 获取最大百分比 * * @param value * @return */ public static String maxNumPercent(String[] value) { Set<String> set = new LinkedHashSet<>(Arrays.asList(value)); Map<String, Integer> countMap = new LinkedHashMap<>(); for (String var : set) { int count = 0; for (String v : value) { if (var.equals(v)) { count++; } } countMap.put(var, count); } //求和 int sum = 0; for (Map.Entry<String, Integer> entry : countMap.entrySet()) { sum += entry.getValue(); } //求最大值 int max = 0; String maxKey = ""; for (Map.Entry<String, Integer> entry : countMap.entrySet()) { String key = entry.getKey(); Integer entryValue = entry.getValue(); if (StringUtils.isNotBlank(key)) { if (entryValue > max) { max = entryValue; maxKey = key; } } } String numPercent = ""; if (sum != 0) { Double value1 = Double.valueOf(max) / Double.valueOf(sum); numPercent = getNumPercent(value1); } return maxKey + "(" + numPercent + ")"; } /** * 数据的标准差 * * @param value * @return */ public static double sd(String[] value) { double mean = mean(value);//平均值 double sum = 0.0; for (String num : value) { if (StringUtils.isNotBlank(num) && !isContainSpecalSymbol(num)) { double v = Double.valueOf(num) - mean; sum += Math.pow(v, 2); } } double sqrt = Math.sqrt(sum / value.length); return sqrt; } /** * 平均值 * * @param value * @return */ public static double mean(String[] value) { double sum = 0.0; for (String num : value) { if (StringUtils.isNotBlank(num) && !isContainSpecalSymbol(num)) sum += Double.valueOf(num); } return Double.valueOf(getRoundingModeNum(sum / value.length)); } /** * 中位数 * * @param value * @return */ public static double median(String[] value) { List<String> list = getNotEmptyValue(value); int length = list.size(); double median; if (length % 2 == 0) { int first = (length / 2) - 1; int next = first + 1; median = (Double.valueOf(list.get(first)) + Double.valueOf(list.get(next))) / 2; } else { int index = ((length + 1) / 2) - 1; median = Double.valueOf(list.get(index)); } return Double.valueOf(getRoundingModeNum(median)); } /** * 临近均值 * * @param flyPast * @param value * @return */ public static NearDto nearMean(Integer flyPast, String[] value) { NearDto nearDto = new NearDto(); List<String> valueList = Arrays.asList(value); Map<Integer, String> lostData = getLostValueIndex(valueList); for (Integer key : lostData.keySet()) { List<String> subList = new ArrayList<>(); List<String> leftList = valueList.subList((key - flyPast < 0 ? 0 : key - flyPast), key); subList.addAll(leftList); List<String> rightList = valueList.subList(key + 1, (key + flyPast + 1 > valueList.size() ? valueList.size() : key + flyPast + 1)); subList.addAll(rightList); double sum = 0.0; for (String var : subList) { if (!isContainSpecalSymbol(var)) { sum += Double.valueOf(var); } } Double avg = sum / flyPast / 2; value[key] = String.valueOf(getRoundingModeNum(avg)); } Multimap<String, String> multiMap = LinkedListMultimap.create(); for (Integer index : lostData.keySet()) { multiMap.put(lostData.get(index), value[index]); } nearDto.setMultiMap(multiMap); nearDto.setNearValue(value); return nearDto; } /** * 临近中位数 * * @param flyPast * @param value * @return */ public static NearDto nearmedian(Integer flyPast, String[] value) { NearDto nearDto = new NearDto(); List<String> valueList = Arrays.asList(value); Map<Integer, String> lostData = getLostValueIndex(valueList); for (Integer key : lostData.keySet()) { List<String> subList = new ArrayList<>(); List<String> leftList = valueList.subList((key - flyPast < 0 ? 0 : key - flyPast), key); subList.addAll(leftList); List<String> rightList = valueList.subList(key + 1, (key + flyPast + 1 > valueList.size() ? valueList.size() : key + flyPast + 1)); subList.addAll(rightList); String[] strings = subList.toArray(new String[subList.size()]); double median = median(strings); value[key] = String.valueOf(median); } Multimap<String, String> multiMap = LinkedListMultimap.create(); for (Integer index : lostData.keySet()) { multiMap.put(lostData.get(index), value[index]); } nearDto.setMultiMap(multiMap); nearDto.setNearValue(value); return nearDto; } /** * 获取缺失值,以及缺失值对应的索引 * * @param valueList * @return */ public static Map<Integer, String> getLostValueIndex(List<String> valueList) { Map<Integer, String> lostData = new LinkedHashMap<>(); int index = 0; for (String var : valueList) { if (StringUtils.isBlank(var)) { lostData.put(index, var); } else { if (isContainSpecalSymbol(var)) { lostData.put(index, var); } } index++; } return lostData; } /** * 获取不为空的排序后的数据 * * @param value * @return */ private static List<String> getNotEmptyValue(String[] value) { List<String> list = new ArrayList<>(); for (String var : value) { if (StringUtils.isNotBlank(var) && !isContainSpecalSymbol(var)) { list.add(var); } } Collections.sort(list); return list; } /** * 获取最小跨度数 * * @param value * @return */ public static Integer getMinFlyPast(String[] value) { int index = 0; //获取首个特殊字符或者null的位置 for (int i = 0; i < value.length; i++) { if (isContainSpecalSymbol(value[i])) { index = i; break; } } //如果首个位置是null或者特殊字符 if (index == 0) { for (int i = 0; i < value.length; i++) { if (StringUtils.isNotBlank(value[i])) { if (isNumeric(value[i])) { break; } } index++; } return index + 1; } int left = 0, right = 0; for (int i = index; i >= 0; i--) { if (isContainSpecalSymbol(value[i])) { break; } else { left++; } } for (int i = index; i < value.length; i++) { if (isContainSpecalSymbol(value[i])) { break; } else { right++; } } return right > left ? right : left; } /** * 是否包含特殊字符 * * @param var * @return */ public static boolean isContainSpecalSymbol(String var) { boolean find = false; if (StringUtils.isNotBlank(var)) { String regEx = "[+\\-*~`!@#$%^&()=_ {}|<>?/:;\\\\'\\[\\][a-zA-Z]]"; String regEx2 = "[\\u4e00-\\u9fa5]"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(StringUtils.trim(var)); Pattern p2 = Pattern.compile(regEx2); Matcher m2 = p2.matcher(var); if (m.find() || m2.find()) { find = true; } } else { find = true; } return find; } /** * 获取缺失值 * * @param value * @return */ public static Map<String, String> getMissingValue(String[] value) { int nullValue = 0; Map<String, String> resultMap = new LinkedHashMap<>(); String regEx = "[+\\-*~`!@#$%^&()=_ {}|<>?/:;\\\\'\\[\\]]"; Pattern p = Pattern.compile(regEx); List<String> symbolList = new ArrayList<>(); for (String var : value) { if (StringUtils.isBlank(var)) { nullValue++; } Matcher m = p.matcher(StringUtils.trim(var)); if (m.find()) { String group = m.group(); symbolList.add(group); } } resultMap.put(null, nullValue + ""); for (String symbol : symbolList) { int count = 0; for (String var : value) { if (symbol.equals(var)) { count++; } } resultMap.put(symbol, count + ""); } return resultMap; } /** * * @param str * @return */ public static boolean isNumeric(String str) { String regEx = "^\\d*$|^\\d*[.]\\d*$|^-\\d*$|^-\\d*[.]\\d*$"; Pattern p = Pattern.compile(regEx); Matcher matcher = p.matcher(str); return matcher.matches(); } public static String getNumber(String value) { if (isNumeric(value)) { Double dValue = Double.valueOf(value); int intValue = dValue.intValue(); if (intValue == dValue) { return intValue + ""; } } return value; } /** * 计算器 * * @param optSymbol 操作符号 * @param num1 数1 * @param num2 数2 * @return */ public static String calculator(String optSymbol, String num1, String num2) { if (!optSymbol.equals("~")) { if (StringUtils.isBlank(num1) || StringUtils.isBlank(num2)) { return null; } } boolean numeric = StringUtils.isBlank(num1) ? false : isNumeric(num1); boolean numeric1 = StringUtils.isBlank(num2) ? false : isNumeric(num2); if (optSymbol.equals("~")) { if (!numeric && !numeric1) { return null; } } else { if (!numeric || !numeric1) { return null; } } String result = null; switch (optSymbol) { case "+": result = getBigDecimal(num1).add(getBigDecimal(num2)).toString(); break; case "-": result = getBigDecimal(num1).subtract(getBigDecimal(num2)).toString(); break; case "*": result = getBigDecimal(num1).multiply(getBigDecimal(num2)).toString(); break; case "/": BigDecimal bigDecimal = getBigDecimal(num2); if (bigDecimal.doubleValue() != 0) { result = getBigDecimal(num1).divide(bigDecimal, BigDecimal.ROUND_HALF_UP).toString(); } break; case ">": int i = getBigDecimal(num1).compareTo(getBigDecimal(num2)); if (i > 0) { result = "1"; } else if (i < 0) { result = "0"; } break; case "<": Double v1 = Double.valueOf(num1); Double v2 = Double.valueOf(num2); if (v1 > v2) { result = "0"; } else if (v1 < v2) { result = "1"; } break; case "≥": Double v3 = Double.valueOf(num1); Double v4 = Double.valueOf(num2); if (v3 >= v4) { result = "1"; } else { result = "0"; } break; case "≤": Double v5 = Double.valueOf(num1); Double v6 = Double.valueOf(num2); if (v5 > v6) { result = "0"; } else { result = "1"; } break; case "=": Double v7 = Double.valueOf(num1); Double v8 = Double.valueOf(num2); if (v7.equals(v8)) { result = "1"; } else { result = "0"; } break; case "≠": Double v9 = Double.valueOf(num1); Double v10 = Double.valueOf(num2); if (!v9.equals(v10)) { result = "1"; } else { result = "0"; } break; case "^": int intValue = getBigDecimal(num2).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); result = getBigDecimal(num1).pow(intValue).toString(); break; case "~": if (StringUtils.isNotBlank(num1)) { int i1 = ~getBigDecimal(num1).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); result = i1 + ""; } else if (StringUtils.isNotBlank(num2)) { int i1 = ~getBigDecimal(num2).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); result = i1 + ""; } break; case "&": int intValue1 = getBigDecimal(num1).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); int intValue2 = getBigDecimal(num2).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); if (intValue1 > 0 && intValue2 > 0) { result = "1"; } else { result = "0"; } break; case "|": int intValue3 = getBigDecimal(num1).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); int intValue4 = getBigDecimal(num2).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); if (intValue3 < 1 && intValue4 < 1) { result = "0"; } else { result = "1"; } break; } return result; } private static BigDecimal getBigDecimal(String number) { return new BigDecimal(number); } /** * 获取数据的百分比格式 * * @param value * @return */ public static String getNumPercent(Double value) { NumberFormat nf = NumberFormat.getPercentInstance(); String format = nf.format(value); return format; } //获取四舍五入后的数字 public static String getRoundingModeNum(Double value) { NumberFormat nf = NumberFormat.getInstance(); nf.setRoundingMode(RoundingMode.HALF_UP); nf.setMaximumFractionDigits(0); return nf.format(value); } public static String getRoundingModeNum(Double value, int num) { NumberFormat nf = NumberFormat.getInstance(); nf.setRoundingMode(RoundingMode.HALF_UP); nf.setMaximumFractionDigits(num); return nf.format(value); } /** * 格式化时间 * @param date * @return */ public static String getFormatDateValue(String date) { try { if(StringUtils.isBlank(date)){ return null; } String pattern="yyyy-MM-dd HH:mm:ss"; String regEx = "\\d{4}\\-\\d{2}\\-\\d{4}:\\d{2}:\\d{2}"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(date); if(m.find()){ pattern="yyyy-MM-ddHH:mm:ss"; } SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern); Date parse = simpleDateFormat.parse(date); return getFormatDateValue(parse); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 格式化时间 * @param date * @return */ public static String getFormatDateValue(Date date) { try { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss"); return simpleDateFormat.format(date); } catch (Exception e) { e.printStackTrace(); } return null; } public static Date getFormatDate(String date) { try { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss"); return simpleDateFormat.parse(date); } catch (Exception e) { e.printStackTrace(); } return null; } }
这篇关于Java数学运算工具类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11有哪些好用的家政团队管理工具?
- 2025-01-11营销人必看的GTM五个指标
- 2025-01-11办公软件在直播电商前期筹划中的应用与推荐
- 2025-01-11提升组织效率:上级管理者如何优化跨部门任务分配
- 2025-01-11酒店精细化运营背后的协同工具支持
- 2025-01-11跨境电商选品全攻略:工具使用、市场数据与选品策略
- 2025-01-11数据驱动酒店管理:在线工具的核心价值解析
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide
- 2025-01-11不得不了解的高效AI办公工具API