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<String> list = Arrays.asList(strs.split("")); //坑 用Arrays.aslist得到的不是一个ArrayList而是一个Arrays的一个内部类 无法直接使用add方法
List<String> list = Lists.newArrayList(strs.split(""));
boolean allow = isAllow(list);
System.out.println(allow);
}
public static boolean isAllow(List<String> 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 CompareResult = expressionParser.parseExpression(item).getValue(Boolean.class);//开始进行比较
if (CompareResult == false) {//如果当前比较结果不成立 则无需向后进行比较 可直接返回false
return CompareResult;
} else {//否则 以当前比较式的比较符右方比较数为基础开始进行下一次的循环比较
i = index;//恢复下标
item = list.get(i);//拼接第一位字符
thereAreCompareOperator = false;//恢复到未出现过比较符的状态
}
continue;//跳出本次循环
}
}
item += list.get(i);//拼接字符串
}
return true;//如果循环比较完毕没有出现false 直接返回true
}