再开发中我们经常 遇到 大于, 小于,小于等于,大于等于四种组合的工具 。
我们用数据的集合表示( 表示 大于。)表示小于 [表示大于等于,]表示小于等于
例如(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); } } }