|
|
@@ -382,10 +382,11 @@ public class BaseUtils {
|
|
|
loop=200;
|
|
|
for (int k = 0; k < total - hzi; k++) {
|
|
|
BigDecimal tb;
|
|
|
+ int salt=Math.max(1,(max - min) / 2);
|
|
|
if (rd.nextBoolean()) {
|
|
|
- tb = new BigDecimal(rd.nextInt(((max - min) / 2)) + max + 1).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
|
|
|
+ tb = new BigDecimal(rd.nextInt(salt) + max + 1).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
|
|
|
} else {
|
|
|
- tb = new BigDecimal(min - 1 - rd.nextInt(((max - min) / 2))).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
|
|
|
+ tb = new BigDecimal(min - 1 - rd.nextInt(salt)).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
|
|
|
}
|
|
|
if(tb.compareTo(BigDecimal.ZERO)==0&&loop>0){
|
|
|
loop--;
|
|
|
@@ -405,6 +406,148 @@ public class BaseUtils {
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
+ public static List<Object> b445random(Object hz, Object design, Object dev, Object failed, Object xN) {
|
|
|
+ List<Object> measureOut = new ArrayList<>();
|
|
|
+ String hzStr =handleNull(hz);
|
|
|
+ String designStr =handleNull(design);
|
|
|
+ String deviationStr = handleNull(dev);
|
|
|
+ if (isNotEmpty(hzStr, designStr, deviationStr)) {
|
|
|
+ String passStr = handleNull(failed);
|
|
|
+ if (StringUtils.isEmpty(passStr)) {
|
|
|
+ passStr = "0";
|
|
|
+ }
|
|
|
+ String[] rateIn = hzStr.split("/");
|
|
|
+ rateIn = Arrays.stream(rateIn).filter(StringUtils::isNotEmpty).toArray(String[]::new);
|
|
|
+ String[] designIn = designStr.split("/");
|
|
|
+ designIn = Arrays.stream(designIn).filter(StringUtils::isNotEmpty).toArray(String[]::new);
|
|
|
+ String[] deviationIn = deviationStr.split("/");
|
|
|
+ deviationIn = Arrays.stream(deviationIn).filter(StringUtils::isNotEmpty).toArray(String[]::new);
|
|
|
+ if (xN != null) {
|
|
|
+ deviationIn = Arrays.stream(deviationIn).map(e -> coefficient(e, Double.parseDouble(xN.toString()))).toArray(String[]::new);
|
|
|
+ }
|
|
|
+ String[] passIn = passStr.split("/");
|
|
|
+ passIn = Arrays.stream(passIn).filter(StringUtils::isNotEmpty).toArray(String[]::new);
|
|
|
+ if (designIn.length > 0) {
|
|
|
+ for (int i = 0; i < designIn.length; i++) {
|
|
|
+ String e = designIn[i];
|
|
|
+ int _hz = Integer.parseInt(i < rateIn.length ? rateIn[i] : rateIn[rateIn.length - 1]);
|
|
|
+ String _deviation = i < deviationIn.length ? deviationIn[i] : deviationIn[deviationIn.length - 1];
|
|
|
+ String _pass = i < passIn.length ? passIn[i] : passIn[passIn.length - 1];
|
|
|
+ int _scale = getScaleZero(e, _deviation);
|
|
|
+ String delimiter = handleNull(matcherFindGroup("[^0-9.]", e, 0, false));
|
|
|
+ if (StringUtils.isEmpty(delimiter)) {
|
|
|
+ delimiter = "@";
|
|
|
+ }
|
|
|
+ String[] _des = e.split("[" + delimiter + "]");
|
|
|
+ List<Object> _tmp = new ArrayList<>();
|
|
|
+ for (String _de : _des) {
|
|
|
+ List<Object> list;
|
|
|
+ double passD = Double.parseDouble(_pass);
|
|
|
+ /**大于0小于1则表示合格率,否则是不合格数量*/
|
|
|
+ double rate = (0 < passD && passD < 1) ? passD : (_hz - passD) / _hz;
|
|
|
+ list = cmv(_hz, _de, _deviation, rate, _scale);
|
|
|
+ if (list != null && !list.isEmpty()) {
|
|
|
+ if (list.size() > _tmp.size()) {
|
|
|
+ _tmp.addAll(list);
|
|
|
+ } else {
|
|
|
+ for (int n = 0; n < _tmp.size(); n++) {
|
|
|
+ /*假如设计值是DxD1这种形式,则需要把生成的实测值拼接起来*/
|
|
|
+ _tmp.set(n, join(_tmp.get(n), list.get(n), delimiter));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ measureOut.addAll(_tmp);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return measureOut;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static List<Object> cmv(Object n, Object design, Object scope, Object rate, Object scale) {
|
|
|
+ if (isNotEmpty(n) && isNotEmpty(design) && isNotEmpty(scope) && isNotEmpty(rate) && isNotEmpty(scale)) {
|
|
|
+ return rangeList(n, design, scope, 1, scale, rate);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @return java.lang.Object
|
|
|
+ * @Description 返回正则式匹配内容
|
|
|
+ * @Param [regex:正则式, value:匹配的字符串, i:group(i), g:是否返回全局搜索,全局搜索返回的是列表]
|
|
|
+ * @Author yangyj
|
|
|
+ * @Date 2021.01.08 16:31
|
|
|
+ **/
|
|
|
+ public static Object matcherFindGroup(String regex, String value, int i, boolean g) {
|
|
|
+ Matcher m = Pattern.compile(regex).matcher(value);
|
|
|
+ List<Object> result = new ArrayList<>();
|
|
|
+ while (m.find()) {
|
|
|
+ result.add(m.group(i));
|
|
|
+ }
|
|
|
+ if (!result.isEmpty()) {
|
|
|
+ if (g) {
|
|
|
+ return result;
|
|
|
+ } else {
|
|
|
+ if(result.get(0).equals("-")){
|
|
|
+ String pattern = "^-?\\d+(\\.\\d+)?([+\\-*/]-?\\d+(\\.\\d+)?)*$";
|
|
|
+ Pattern r = Pattern.compile(pattern);
|
|
|
+ Matcher mm = r.matcher(String.valueOf(value));
|
|
|
+ boolean b = mm.matches();
|
|
|
+ if(b){
|
|
|
+ return result.get(1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result.get(0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String join(Object... args) {
|
|
|
+ if (args != null) {
|
|
|
+ if (args.length > 2) {
|
|
|
+ List<String> list = Arrays.stream(args).limit(args.length - 1).map(BaseUtils::handleNull).collect(Collectors.toList());
|
|
|
+ String split = handleNull(args[args.length - 1]);
|
|
|
+ return join(list, split);
|
|
|
+ } else {
|
|
|
+ return handleNull(args[0]);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ public static boolean isNotEmpty(Object... values) {
|
|
|
+ for (Object value : values) {
|
|
|
+ if (isEmpty(value)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ public static String coefficient(String dev, double xN) {
|
|
|
+ if (StringUtils.isNotEmpty(dev) && xN != 1) {
|
|
|
+ String[] da = dev.split("[,,]");
|
|
|
+ int scale = getScale(xN);
|
|
|
+ dev = number2StringZero(Double.parseDouble(da[0]) * xN, scale) + "," + number2StringZero(Double.parseDouble(da[1]) * xN, scale);
|
|
|
+ }
|
|
|
+ return dev;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @return java.lang.String
|
|
|
+ * @Description 返回保留指定小数位数字字符串
|
|
|
+ * @Param [number, scale]
|
|
|
+ * @Author yangyj
|
|
|
+ * @Date 2021.10.15 10:35
|
|
|
+ **/
|
|
|
+ public static String number2StringZero(Object number, Object scale) {
|
|
|
+ if (isNumber(number)) {
|
|
|
+ if (isEmpty(scale)) {
|
|
|
+ scale = 0;
|
|
|
+ }
|
|
|
+ return new BigDecimal(handleNull(number)).setScale(handleObj2Integer(scale), RoundingMode.HALF_UP).toString();
|
|
|
+ }
|
|
|
+ return "";
|
|
|
+ }
|
|
|
|
|
|
/*是否包含链*/
|
|
|
public static boolean notInChain(List<String> cp,String s){
|