Java-校验值区间值的连续性

发布于:2025-03-22 ⋅ 阅读:(19) ⋅ 点赞:(0)

最新版本更新
https://code.jiangjiesheng.cn/article/363?from=csdn

c<30,30≤c<60,60≤c<100,100≤c 有值时,必须收尾相等。

BigDecimal endCheckValue = null;
for (BssCompareMethodParameterConfigAddVO configRow : actualSampleCompareList) {
	endCheckValue = checkAddGetNextEndValueFromRow(endCheckValue, configRow);
}

//校验通过了后记录当前行,并取下一个开始的
private BigDecimal checkAddGetNextEndValueFromRow(BigDecimal lastValue, String measureValueRange, String rowKey) {
    if (StringUtils.isBlank(measureValueRange)) {
        return null;
    }
    //c<30,30≤c<60,60≤c<100,100≤c
    List<BigDecimal> decimals = getNumeralFromStr(measureValueRange);
    if (CollectionUtils.isEmpty(decimals)) {
        throw new GnException(rowKey + "未填写正确的参比法测量值(c)区间:" + measureValueRange);
    }
    BigDecimal startCheckValue = decimals.get(0);

    if (lastValue != null && !lastValue.equals(startCheckValue)) {
        //注意,如果前端提交的两组的名称相同,那后端的逻辑分组就变成了1组
        //如果需要校验名称重复,应该需要新增字段表示分组,启用 BssAnalysisMethodResultShowParameterConfigSaveVO::getAnalysisMethodUniqueTag
        //不过没意义,分组字段和方法名称都需要前端控制不同,功能上实际是重复,且还需要保存。
        throw new GnException(rowKey + "存在错误的参比法测量值(c)区间:" + measureValueRange);
    }
    //endCheckValue
    return decimals.size() == 2 ? decimals.get(1) : startCheckValue;
}

public static void main(String[] args) {
    // 示例输入字符串 Pattern.compile("[-+]?\\d*\\.?\\d+");
    String expression = "c<30";
    System.out.println(getNumeralFromStr(expression));
    expression = "30≤c<60";
    System.out.println(getNumeralFromStr(expression));
    expression = "60≤c<100.3";
    System.out.println(getNumeralFromStr(expression));
    expression = "100≤c";
    System.out.println(getNumeralFromStr(expression));

}

private static List<BigDecimal> getNumeralFromStr(String expression) {
    // 正则表达式匹配数字
    Pattern pattern = Pattern.compile("[-+]?\\d*\\.?\\d+");
    Matcher matcher = pattern.matcher(expression);
    List<BigDecimal> numbers = new ArrayList<>();

    // 查找并收集所有找到的数字
    while (matcher.find()) {
        String numberStr = matcher.group();
        BigDecimal number = new BigDecimal(numberStr);
        numbers.add(number);
    }
    return numbers;
}

最新版本更新
https://code.jiangjiesheng.cn/article/363?from=csdn