今天在项目中需要解析一个参数范围的字符串,然后判断一个传入参数是否在这个表达式内。因为参数范围字符串是(0<p<10 or 0<=p<10 or 0<p<=10 or 0<=p<=10)的组合,所以我觉得直接去进行split处理比较麻烦,就运用了String转为 byte[] 再做处理。代码如下。
不知道大家有没有更好的处理方式。
package test_lzg; import java.util.ArrayList; import java.util.List; public class A { public static void main(String[] args) { String paramRangeString = "0<p<=10"; String paramStr = "11"; System.out.println(parseParamRange(paramRangeString, paramStr)); paramRangeString = "0<=p<=10"; paramStr = "5"; System.out.println(parseParamRange(paramRangeString, paramStr)); } /** * 解析参数范围表达式 * * @param paramRangeString 表达式的字符串。表达式可能为(0<p<10 or 0<=p<10 or 0<p<=10 or 0<=p<=10) * @param paramStr 需要判断的参数 * @return */ private static boolean parseParamRange(String paramRangeString, String paramStr) { byte[] paramRangeByteArr = paramRangeString.getBytes(); // 将字符串转换为byte[]来处理 List<Byte> minNumList = new ArrayList<Byte>(); List<Byte> maxNumList = new ArrayList<Byte>(); String leftOpt = ""; String rightOpt = ""; boolean isLeftOpt = true; // 标记是第一次出现还是第二次出现,第一次为true for (int i = 0, len = paramRangeByteArr.length; i < len; i++) { if (paramRangeByteArr[i] == 60) { // 60 是"<"对应的ascii 码 if (paramRangeByteArr[i + 1] == 61) { // 61 是"="对应的ascii 码 if (isLeftOpt) { leftOpt = "<="; } else { rightOpt = "<="; } i++; } else { if (isLeftOpt) { leftOpt = "<"; } else { rightOpt = "<"; } } isLeftOpt = false; continue; } if (48 <= paramRangeByteArr[i] && paramRangeByteArr[i] <= 57) { // 48是 "0"的 ascii码,57是"9"的ascii码 if (isLeftOpt) { minNumList.add(paramRangeByteArr[i]); } else { maxNumList.add(paramRangeByteArr[i]); } } } // 将左边界的数从list中,放入byte[],方便转换为String byte[] leftBorder = new byte[minNumList.size()]; for (int i = 0, len = minNumList.size(); i < len; i++) { leftBorder[i] = minNumList.get(i); } // 将右边界的数从list中,放入byte[],方便转换为String byte[] rightBorder = new byte[maxNumList.size()]; for (int i = 0, len = maxNumList.size(); i < len; i++) { rightBorder[i] = maxNumList.get(i); } // 打印测试,看解析是否正确 System.out.println(new String(leftBorder) + leftOpt); System.out.println(rightOpt + new String(rightBorder)); return judgeParamRange(paramStr, new String(leftBorder), leftOpt, true) && judgeParamRange(paramStr, new String(rightBorder), rightOpt, false); } /** * * 判断参数是否在该范围 * * @param paramStr 需要判断的参数 * @param borderParamStr 边界值 * @param opt 与边界值相关的符号(< or <=) * @param isLeftBorder 是否是左边界 * @return */ private static boolean judgeParamRange(String paramStr, String borderParamStr, String opt, boolean isLeftBorder) { Float borderParam = Float.valueOf(borderParamStr); // 将边界值转换为 Float Float param = Float.valueOf(paramStr); // 将需要判断的参数转换为Float if (isLeftBorder) { // 如果为左边界 if ("<".equals(opt)) { if (borderParam >= param) { return false; } } else if ("<=".equals(opt)) { if (borderParam > param) { return false; } } } else { // 否则为右边界 if ("<".equals(opt)) { if (param >= borderParam) { return false; } } else if ("<=".equals(opt)) { if (param > borderParam) { return false; } } } return true; } }
时间: 2024-11-08 01:29:42