java 判断一组复杂比较式是否成立

java 判断一组复杂比较式是否成立,第1张

java 判断一组复杂比较式是否成立
    public static void main(String[] args) {

        //(10+2-3)<=50<=(5*12) true
        //(10+2-3)<=50<=(5*12)>=(20*9) false
        //(10+2-3)<=50<=(5*12)>=(20*(9-2))<=(10/3) false

        String strs = "(10+2-3)<=50<=(5*12)>=(20*(9-2))<=(10/3)";
//        List list = Arrays.asList(strs.split(""));  //坑 用Arrays.aslist得到的不是一个ArrayList而是一个Arrays的一个内部类 无法直接使用add方法
        List list = Lists.newArrayList(strs.split(""));
        boolean allow = isAllow(list);
        System.out.println(allow);

    }

    public static boolean isAllow(List list) {
        list.add("<");//在列表最后加入一个任意比较符 起到辅助功能(防止下方for循环执行完毕后直接返回 不进行最后一次比较) 后续建议优化
        expressionParser expressionParser = new SpelexpressionParser();
//        System.out.println(list);

        String item = "";
        Pattern pattern = Pattern.compile("[<|=|<=|>|>=]");//正则表达式 用于判断当前位字符是否为比较符
//        Matcher m;
        Integer index = 0;//用于记录下标 记录到当前表达式的比较符右方比较数
        Boolean thereAreCompareOperator = false;//是否出现过比较符 可比较的最小单位允许有且仅有一个或一组比较符出现(如 <或<=)当第二次遇到比较符时应当不计入并立即计算出现有的比较结果
        for (int i = 0; i < list.size(); i++) {
            if (!thereAreCompareOperator) {//在没有出现过比较符的时候 判断当前字符前一位是否为比较符
                if (i > 0) {//i>0时才执行下方代码 防止出现下标异常
                    //如果前一位字符是比较符 且当前字符不是比较符时证明已经出现了比较符(第二个判断条件是为了应对出现组合比较符的情况)
                    if (pattern.matcher(list.get(i - 1)).find() && !pattern.matcher(list.get(i)).find()) {
                        thereAreCompareOperator = true;//已经出现比较符
                        index = i;//记住当前下标 下次比较要沿用当前被比较数 如 1<2<3 当比较完1和2后 要保留2用于下次和3进行比较
                    }
                }
            } else {//已经出现过比较符时 开始判断后一位是否为比较符
                if (pattern.matcher(list.get(i)).find()) {//如果后一位是比较符 则证明当前比较式已经可以进行比较
                    Boolean value = expressionParser.parseexpression(item).getValue(Boolean.class);//开始进行比较
                    if (value == false) {//如果当前比较结果不成立 则无需向后进行比较 可直接返回false
                        return value;
                    } else {//否则 以当前比较式的比较符右方比较数为基础开始进行下一次的循环比较
                        i = index;//恢复下标
                        item = list.get(i);//拼接第一位字符
                        thereAreCompareOperator = false;//恢复到未出现过比较符的状态
                    }
                    continue;//跳出本次循环
                }
            }

            item += list.get(i);//拼接字符串
        }
        return true;//如果循环比较完毕没有出现false 直接返回true
    }

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5605761.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存