springboot将代码配置化,通过不同的配置参数来调用不同的方法
刚接到一个需求,将之前写好的代码改成配置,通过修改配置文件,然后调用不同的方法,从而达到满足需求。
- 之前写好的代码 ,这是一个utils,我就拿出我需要的部分
/**
* * 获取两字符串的相似度数据
*/
public JSONObject getSimilarityRatio(String str, String target) {
JSONObject resultJ = new JSONObject();
// 去除空白字符、换行、标点符号
String regex = "[\\pP\\p{Punct}\\s]";
// System.out.println("str= " + str.replaceAll(regex, ""));
// System.out.println("target= " + target.replaceAll(regex, ""));
resultJ.put("recLabel", str);
resultJ.put("manualTxt", target);
// 最小改变步骤
int minStep = compare(str.replaceAll(regex, ""), target.replaceAll(regex, ""));
resultJ.put("minStep", minStep);
// System.out.println("最少改动步骤数:" + minStep + " 步");
// System.out.println("insert_num= " + insert_num);
// System.out.println("delete_num= " + delete_num);
// System.out.println("substitute_num= " + substitute_num);
// System.out.println("correct_num= " + correct_num);
// System.out.println("target_num= " + target_num);
resultJ.put("numI", insert_num);
resultJ.put("numD", delete_num);
resultJ.put("numS", substitute_num);
resultJ.put("numH", correct_num);
resultJ.put("numN", target_num);
float corr, acc;
if (correct_num == 0 || target_num == 0 || correct_num - insert_num < 0) {
corr = 0;
acc = 0;
} else {
corr = (float) ((int) (((float) correct_num / (float) target_num) * 10000)) / 100;
acc = (float) ((int) (((float) (correct_num - insert_num) / (float) target_num) * 10000)) / 100;
}
resultJ.put("Acc", acc);
resultJ.put("Corr", corr);
// System.out.println("Acc= " + acc);
// System.out.println("Corr= " + corr);
return resultJ;
}
/**
* 单独计算准确率和正确率
* @param taskDataAccList
* @return
*/
public JSONObject calcuAccAndCorr(List<JSONObject> taskDataAccList){
JSONObject jsonObject = new JSONObject();
Integer sumI = 0;
Integer sumH = 0;
Integer sumN = 0;
for (JSONObject taskDataAccJ : taskDataAccList) {
sumI += taskDataAccJ.getInteger("numI");
sumH += taskDataAccJ.getInteger("numH");
sumN += taskDataAccJ.getInteger("numN");
}
//正确率
float sumAcc = 0;
//准确率
float sumCorr = 0;
if (sumN > 0) {
sumCorr = (float) ((int) (((float) sumH / (float) sumN) * 10000)) / 100;
sumAcc = (float) ((int) (((float) (sumH - sumI) / (float) sumN) * 10000)) / 100;
sumAcc = (sumAcc < 0) ? 0 : sumAcc;
}
jsonObject.put("sumAcc", sumAcc);
jsonObject.put("sumCorr", sumCorr);
return jsonObject;
}
/**
*
* @param resultString 语音识别文本
* @param standardScript 标准文本
* @return 偏移率
*/
public float getDeviationRate(String resultString, String standardScript) {
//去掉标点符号,标点符号不做偏移率计算
String strstandardScript = standardScript.replaceAll("[\\pP\\p{Punct}]", "");
String strresultString = resultString.replaceAll("[\\pP\\p{Punct}]", "");
logger.info("standardScript:" + strstandardScript);
logger.info("resultString: " + strresultString);
int length= 0;
char[] charstandardScripts = strstandardScript.toCharArray();
char[] chartrresultStrings = strresultString.toCharArray();
logger.info("标准文本长度:" + charstandardScripts.length);
logger.info("识别文本长度:" + chartrresultStrings.length);
if (charstandardScripts.length>chartrresultStrings.length) {
length=chartrresultStrings.length;
}else {
length=charstandardScripts.length;
}
logger.info("使用文本长度:" + length);
float state = 0;
for (int i = 0; i < length; i++) {
if (chartrresultStrings[i] == charstandardScripts[i]) {
state++;
}
}
logger.info("正确数:" + state);
float rate = changeDeviationRate(state/charstandardScripts.length);
//JSONObject rate = changeDeviationRate(state/charstandardScripts.length);
return rate;
}
//flaot保留两位
public float changeDeviationRate(float rate) {
Float priceCar = rate;
// 设置位数
int scale = 2;
// 表示四舍五入,可以选择其他舍值方式,例如去尾,等等.
int roundingMode = 4;
BigDecimal bd = new BigDecimal((float) priceCar);
bd = bd.setScale(scale, roundingMode);
priceCar = bd.floatValue();
return priceCar;
}
上面代码就是需要通过不同的配置,然后调用不同的方法
接下来就是要写一个配置
/**
* TextCompConfig 偏移率和正确率配置路径
*/
@ConfigurationProperties(prefix = "textcomp.patch")
@Component
public class TextCompConfig {
//textComp的配置
private String textcomp;
public TextCompConfig(String textcomp) {
this.textcomp = textcomp;
}
public TextCompConfig() {
}
public String getTextcomp() {
return textcomp;
}
public void setTextcomp(String textcomp) {
this.textcomp = textcomp;
}
@Override
public String toString() {
return "TextCompConfig{" +
"textcomp=" + textcomp +
'}';
}
}
这个类主要就是一个@ConfigurationProperties(prefix = "textcomp.patch")
注解,可以在配置中进行配置
配置类写好之后,就是进行选择判断,假如在配置文件中配置的是1,那么就会调用1这个方法,如果配置文件中是2,那么就会调用2这个方法
/**
* 配置化
* @param resultString
* @param standardScript
* @return
*/
public JSONObject getTextComp(String resultString, String standardScript) {
String textComp = textCompConfig.getTextcomp();
JSONObject jsonObject = new JSONObject();
if (textComp.equals("1")) {
//计算正确率和准确率
return this.getSimilarityRatio(resultString,standardScript);
}
if (textComp.equals("2")){
//计算偏移率
float deviationRate = this.getDeviationRate(resultString, standardScript);
//将float转化为string格式
String deviationRate1 = (String) jsonObject.put("deviationRate", deviationRate + "");
//将string转为jsonObject
return JSON.parseObject(deviationRate1);
}
return jsonObject;
}
由于后面同事写的返回的是一个JSONObject类型,而getSimilarityRatio()方法的返回值是JSONObject,所有我这边统一返回一个JSONObject类,但是getDeviationRate()方法返回的是一个float类型,所以要将float类型转为JSONObject类,这里做了一个判断,如果配置是1,调用1这个方法,配置为2,就调用2这个方法
然后就是controller层的调用
@ApiOperation(value = "文字准确率和正确率测试", notes = "文字准确率和正确率测试")
@RequestMapping(value = "/accTest", method = RequestMethod.POST)
@ApiImplicitParams({
@ApiImplicitParam(name = "iatTxt", value = "识别文本", dataType = "string", paramType = "query", example = "张三", required = false),
@ApiImplicitParam(name = "targetTxt", value = "目标文本", dataType = "string", paramType = "query", example = "123456", required = false)})
public ResponseVo accTest(@RequestBody CalcuTxtInfo calcuTxtInfo) {
ResponseVo responseVo = new ResponseVo();
// JSONObject jsonObject = textCompUtils.getSimilarityRatio(calcuTxtInfo.getIatTxt(), calcuTxtInfo.getTargetTxt());
JSONObject jsonObject = textCompUtils.getTextComp(calcuTxtInfo.getIatTxt(), calcuTxtInfo.getTargetTxt());
if (textCompConfig.getTextcomp().equals("1")) {
//计算正确率和准确率
calcuTxtInfo.setSumCorr(new BigDecimal(Float.valueOf(jsonObject.get("Corr").toString()) / 100).setScale(3, BigDecimal.ROUND_HALF_UP).floatValue());
calcuTxtInfo.setSumAcc(new BigDecimal(Float.valueOf(jsonObject.get("Acc").toString()) / 100).setScale(3, BigDecimal.ROUND_HALF_UP).floatValue());
responseVo.setData(calcuTxtInfo);
return responseVo;
}
if (textCompConfig.getTextcomp().equals("2")) {
//计算偏移率
float deviationRate = textCompUtils.getDeviationRate(calcuTxtInfo.getIatTxt(), calcuTxtInfo.getTargetTxt());
responseVo.setData(deviationRate);
return responseVo;
}
// float deviationRate = textCompUtils.getDeviationRate(calcuTxtInfo.getIatTxt(), calcuTxtInfo.getTargetTxt());
return responseVo;
最后就是用的配置文件了,我这个用的是properties
# 偏离度
textcomp.patch.textcomp=1
这个需求我自己测试是可以的