大于,小于,小于等于,大于等于,获取数据范围的小工具

本文介绍了在Java开发中如何处理大于、小于等组合条件,使用BigDecimal进行数值比较,并提到与MySQL查询相比,这种方法的灵活性和减少字段冗余的优点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

再开发中我们经常 遇到 大于, 小于,小于等于,大于等于四种组合的工具 。

我们用数据的集合表示( 表示 大于。)表示小于 [表示大于等于,]表示小于等于

例如(0,10],(10,20)表示 大于0 小于等于10,大于10 小于20的数据。

获取条件

private static Object[]  getConditions(String range){
    char[] rangeCharArray = range.toCharArray();
    List<Object> conditions  = new ArrayList<>(4);

    char firstCharAsString = rangeCharArray[0]; // 获取第一位字符
    char lastCharAsString = rangeCharArray[rangeCharArray.length - 1]; // 获取最后一位字符
    boolean isOneRange = Character.isDigit(lastCharAsString);
    int lastIndexSplit =  isOneRange ? range.length() :range.length() -1;

    String[] rangeValue = range.substring(1, lastIndexSplit).split(",");
    // 获取首位参数
    if(HA==firstCharAsString){
        conditions.add(ComparisonType.DAYU);
    }else if(FA==firstCharAsString){
        conditions.add(ComparisonType.DAYUDY);
    }

    conditions.add(new BigDecimal(rangeValue[0]));

    // 获取第末位参数
    if(HB==lastCharAsString){
        conditions.add(ComparisonType.XIAOYU);
    }else if(FH==lastCharAsString){
        conditions.add(ComparisonType.XIAOYUDY);
    }

    if(!isOneRange){
        conditions.add(new BigDecimal(rangeValue[1]));
    }
    return conditions.toArray();
}

进行运算

private static boolean doDynamicRange(BigDecimal compareValue, Object... conditions) {
    // 假设条件数组是交替的比较类型和比较值
    for (int i = 0; i < conditions.length; i += 2) {
        ComparisonType comparisonType = (ComparisonType) conditions[i];
        BigDecimal boundValue = (BigDecimal) conditions[i + 1];
        //isSatisfied 默认fasle ,第一个条件如果成立,则返回true,继续判断第二个条件
        //如果第二个成立 isSatisfied设置为true,也就是说 必须同时满足 两个条件 最终才会吧isSatisfied设置为true
        //同样第一个条件 如果 就不成了 直接跳出循环 比较下一组条件
        boolean isSatisfied;
        switch (comparisonType) {
            case DAYU:
                isSatisfied = compareValue.compareTo(boundValue) > 0;
                break;
            case DAYUDY:
                isSatisfied = compareValue.compareTo(boundValue) >= 0;
                break;
            case XIAOYU:
                isSatisfied = compareValue.compareTo(boundValue) < 0;
                break;
            case XIAOYUDY:
                isSatisfied = compareValue.compareTo(boundValue) <= 0;
                break;
            default:
                throw new IllegalArgumentException("Unsupported comparison type: " + comparisonType);
        }

        if (!isSatisfied) {
            return false;
        }
    }
    return true;
}

main 方法执行  ,工具简单有效,还能二次开发 。

注:下边这个例子是是我们实际开发中遇到的问题,我们 数据库有三条数据,位别是0,110.4档位,10.4 到15.4档位。还有15.4以上的档位,要在动态的筛选出其中一条数据,传入的值是 compareValue 10.4 因为我们后来会需要很多条件,如果用mysql 语句 每次增加新的判断条件 会要引入两个字段进行 判断,如果增肌4个条件就要增加8个字段。会变得很臃肿 繁琐 。

public static void main(String[] args) {

    BigDecimal compareValue = new BigDecimal("10.4");
    String[] strArr = new String[]{"(0,10.4]","(10.4,15.4)","[15.4"};
    for(String str :strArr){
        Object[] conditions =getConditions(str);
        if(doDynamicRange(compareValue, conditions)){
            System.out.println(str);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值