最近做个需求,获取的值value和给定的两个阈值thresholdValue1,thresholdValue2进行比较,然后发送告警,其中value值的类型包括double,int ,String;比较符包括:">" "<"">=""<=""=""!=".
代码的难度不大,然后下面是我写的代码,大家可以略去不看...
<span style="white-space:pre"> </span>public static final int DATA_TYPE_STRING = 0; //值的类型
public static final int DATA_TYPE_INTEGER = 1;
public static final int DATA_TYPE_DOUBLE = 2;
public static final int DATA_TYPE_OTHER = 3;
private boolean isProduceAlarm(String defaultValue, String thresholdValue1, String thresholdValue2, String operator1, String operator2,
int date_type) {
boolean flag = false;
// 如果操作符均为空 或者 defaultValue为空 或者 thresholdValue1为空 并且 thresholdValue2为空
if ((!StringUtil.isNullOrEmpty(operator1) && !StringUtil.isNullOrEmpty(operator2)) || (!StringUtil.isNullOrEmpty(defaultValue))
|| (!StringUtil.isNullOrEmpty(thresholdValue1) && (!StringUtil.isNullOrEmpty(thresholdValue2)))) {
return flag;
}
if (date_type == 1 || date_type == 2) {
if (">".equals(operator1)) {
if ("<".equals(operator2) && Double.parseDouble(defaultValue) > Double.parseDouble(thresholdValue1)
&& Double.parseDouble(defaultValue) < Double.parseDouble(thresholdValue2)) {
flag = true;
} else if ("<=".equals(operator2) && Double.parseDouble(defaultValue) > Double.parseDouble(thresholdValue1)
&& Double.parseDouble(defaultValue) <= Double.parseDouble(thresholdValue2)) {
flag = true;
} else if ("=".equals(operator2) && Double.parseDouble(defaultValue) > Double.parseDouble(thresholdValue1)
&& Double.parseDouble(defaultValue) == Double.parseDouble(thresholdValue2)) {
flag = true;
} else if ("!=".equals(operator2) && Double.parseDouble(defaultValue) > Double.parseDouble(thresholdValue1)
&& Double.parseDouble(defaultValue) != Double.parseDouble(thresholdValue2)) {
flag = true;
} else if (!StringUtil.isNullOrEmpty(operator2) && Double.parseDouble(defaultValue) > Double.parseDouble(thresholdValue1)) {
flag = true;
}
} else if (">=".equals(operator1)) {
if ("<".equals(operator2) && Double.parseDouble(defaultValue) >= Double.parseDouble(thresholdValue1)
&& Double.parseDouble(defaultValue) < Double.parseDouble(thresholdValue2)) {
flag = true;
} else if ("<=".equals(operator2) && Double.parseDouble(defaultValue) >= Double.parseDouble(thresholdValue1)
&& Double.parseDouble(defaultValue) <= Double.parseDouble(thresholdValue2)) {
flag = true;
} else if ("=".equals(operator2) && Double.parseDouble(defaultValue) >= Double.parseDouble(thresholdValue1)
&& Double.parseDouble(defaultValue) == Double.parseDouble(thresholdValue2)) {
flag = true;
} else if ("!=".equals(operator2) && Double.parseDouble(defaultValue) >= Double.parseDouble(thresholdValue1)
&& Double.parseDouble(defaultValue) != Double.parseDouble(thresholdValue2)) {
flag = true;
} else if (!StringUtil.isNullOrEmpty(operator2) && Double.parseDouble(defaultValue) >= Double.parseDouble(thresholdValue1)) {
flag = true;
}
} else if ("=".equals(operator1)) {
if ("<".equals(operator2) && Double.parseDouble(defaultValue) == Double.parseDouble(thresholdValue1)
&& Double.parseDouble(defaultValue) < Double.parseDouble(thresholdValue2)) {
flag = true;
} else if ("<=".equals(operator2) && Double.parseDouble(defaultValue) == Double.parseDouble(thresholdValue1)
&& Double.parseDouble(defaultValue) <= Double.parseDouble(thresholdValue2)) {
flag = true;
} else if ("=".equals(operator2) && Double.parseDouble(defaultValue) == Double.parseDouble(thresholdValue1)
&& Double.parseDouble(defaultValue) == Double.parseDouble(thresholdValue2)) {
flag = true;
} else if ("!=".equals(operator2) && Double.parseDouble(defaultValue) == Double.parseDouble(thresholdValue1)
&& Double.parseDouble(defaultValue) != Double.parseDouble(thresholdValue2)) {
flag = true;
} else if (!StringUtil.isNullOrEmpty(operator2) && Double.parseDouble(defaultValue) == Double.parseDouble(thresholdValue1)) {
flag = true;
}
} else if ("!=".equals(operator1)) {
if ("<".equals(operator2) && Double.parseDouble(defaultValue) != Double.parseDouble(thresholdValue1)
&& Double.parseDouble(defaultValue) < Double.parseDouble(thresholdValue2)) {
flag = true;
} else if ("<=".equals(operator2) && Double.parseDouble(defaultValue) != Double.parseDouble(thresholdValue1)
&& Double.parseDouble(defaultValue) <= Double.parseDouble(thresholdValue2)) {
flag = true;
} else if ("=".equals(operator2) && Double.parseDouble(defaultValue) != Double.parseDouble(thresholdValue1)
&& Double.parseDouble(defaultValue) == Double.parseDouble(thresholdValue2)) {
flag = true;
} else if ("!=".equals(operator2) && Double.parseDouble(defaultValue) != Double.parseDouble(thresholdValue1)
&& Double.parseDouble(defaultValue) != Double.parseDouble(thresholdValue2)) {
flag = true;
} else if (!StringUtil.isNullOrEmpty(operator2) && Double.parseDouble(defaultValue) != Double.parseDouble(thresholdValue1)) {
flag = true;
}
} else if (!StringUtil.isNullOrEmpty(operator1)) {
if ("<".equals(operator2) && Double.parseDouble(defaultValue) < Double.parseDouble(thresholdValue2)) {
flag = true;
} else if ("<=".equals(operator2) && Double.parseDouble(defaultValue) <= Double.parseDouble(thresholdValue2)) {
flag = true;
} else if ("=".equals(operator2) && Double.parseDouble(defaultValue) == Double.parseDouble(thresholdValue2)) {
flag = true;
} else if ("!=".equals(operator2) && Double.parseDouble(defaultValue) != Double.parseDouble(thresholdValue2)) {
flag = true;
}
}
} else if (date_type == 3) {
if (("=".equals(operator1))) {
if (defaultValue.equals(thresholdValue1) && "=".equals(operator2) && defaultValue.equals(thresholdValue2)) {
flag = true;
} else if (defaultValue.equals(thresholdValue1) && "!=".equals(operator2) && !defaultValue.equals(thresholdValue2)) {
flag = true;
} else if (defaultValue.equals(thresholdValue1) && !StringUtil.isNullOrEmpty(operator2)) {
flag = true;
}
} else if ("!=".equals(operator1)) {
if (!defaultValue.equals(thresholdValue1) && "=".equals(operator2) && defaultValue.equals(thresholdValue2)) {
flag = true;
} else if (!defaultValue.equals(thresholdValue1) && "!=".equals(operator2) && !defaultValue.equals(thresholdValue2)) {
flag = true;
} else if (!defaultValue.equals(thresholdValue1) && !StringUtil.isNullOrEmpty(operator2)) {
flag = true;
}
} else if (!StringUtil.isNullOrEmpty(operator1)) {
if ("=".equals(operator2) && defaultValue.equals(thresholdValue2)) {
flag = true;
} else if ("!=".equals(operator2) && !defaultValue.equals(thresholdValue2)) {
flag = true;
}
}
}
return flag;
}
嘿嘿,完成需求,但是是不是非常的乱,而且很容易写错。。。
然后,公司同事帮忙改了下:
private <E> boolean compare(Comparable<E> v, String op, E t) {
boolean judgement = "=".equals(op) && v.equals(t);
judgement = judgement || "!=".equals(op) && !v.equals(t);
judgement = judgement || ">=".equals(op) && v.compareTo(t) >= 0;
judgement = judgement || ">".equals(op) && v.compareTo(t) > 0;
judgement = judgement || "<=".equals(op) && (v).compareTo(t) <= 0;
judgement = judgement || "<".equals(op) && (v).compareTo(t) < 0;
return judgement;
}
private boolean judge(final String value, String op, String threshold, int dateType) {
boolean ignore = null == value || StringUtils.isBlank("" + value) || StringUtils.isBlank(op) || StringUtils.isBlank(threshold);
boolean judgement = false;
if (!ignore) {
switch (dateType) {
case PatrolActionParam.DATA_TYPE_DOUBLE:
judgement = compare(Double.valueOf(value), op, Double.valueOf(threshold));
break;
case PatrolActionParam.DATA_TYPE_INTEGER:
judgement = compare(Integer.valueOf(value), op, Integer.valueOf(threshold));
break;
case PatrolActionParam.DATA_TYPE_OTHER:
case PatrolActionParam.DATA_TYPE_STRING:
judgement = compare(value, op, threshold);
break;
default:
break;
}
}
return judgement;
}
然后执行的时候
if (judge(value, operator1, thresholdValue1, dateType) && judge(value, operator2, thresholdValue2, dateType)) // 发送告警
我想静静