栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/600957.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号