java - How to avoid if statements java7 or make code more readable
问题描述
I am working on the parsing method in java7, so streams, lambdas are not allowed in my code.
The code is parsing expressions like 1-9
, -2--1
, 2E-5 - 9E2"
where E2
is 10^2
. And as a result of the parsing I got String[]
of two numbers: first number of the range and last number.
What I would like to achieve is make the code more readable, maybe avoid if statements and change to some kind of pattern. Or change of the algorithm. First idea is to move each of if statements to another method. But maybe there is another way.
/**
* @param text - analyzes the text below for the occurrence of a range of two numbers
* as a character to the range we use '-'
* the most advanced example for analysis is the one in which there are the most minus signs e. g.
* "-5e-2 - -2e-1" as text
*/
public static String[] prepareRangeNumberToCompare(String text) {
String textToBeAnalyzed = text.trim();
String[] splitText = textToBeAnalyzed.split("-");
//check simple case: (e. g. "0 - 10")
if (splitText.length < 2) {
return new String[] { text };
}
else if (splitText.length == 2) {
return splitText;
}
String firstNumber = splitText[0];
String secondObject = splitText[2];
//check the occurrence of the minus sign at the beginning (e.g. "-1 - 2")
List<String> asList = new LinkedList<String>(Arrays.asList(splitText));
if (text.startsWith("-")) {
firstNumber = "-" + splitText[1];
asList.remove(0);
}
//check the occurrence of the minus sign after the first occurrence of 'e|E' (e.g. "2E-5 - 9E2")
if (asList.size() > 2 && (firstNumber.endsWith("E") || firstNumber.endsWith("e"))) {
firstNumber = firstNumber + "-" + asList.get(1);
asList.remove(1);
secondObject = asList.get(1);
}
//check the occurrence of the minus sign before second text (e.g "-10 - -1")
if (asList.size() > 2 && (asList.get(1).isEmpty() || asList.get(1).matches("\\s+"))) {
secondObject = "-" + asList.get(2);
asList.remove(1);
}
//check the occurrence of the minus sign after the second occurrence of 'e|E' (e.g. "2E-5 - 9E-2")
if (asList.size() > 2 && (secondObject.endsWith("E") || secondObject.endsWith("e"))) {
secondObject = secondObject + "-" + asList.get(2);
asList.remove(1);
}
//if we still have more than 2 items in the list, the user has supplied a wrong range
if (asList.size() > 2) {
return new String[] { text };
}
return new String[] { firstNumber, secondObject };
}
解决方案
有一种更好的方法可以实现您的目标:
public static List<String> prepareRangeNumberToCompare2(String text) {
List<String> result = new ArrayList<>();
String numberPattern = "-?[\\d+](E-?\\d+)?"; // Pattern for a single number.
String spacesPattern = "\\s*"; // Pattern for allowing spaces.
String rangePattern = String.format("(%s)%s-%s(%s)", numberPattern, spacesPattern, spacesPattern,numberPattern); // final pattern is: "(-?[\\d+](E-?\\d+)?)\\s*-\\s*(-?[\\d+](E-?\\d+)?)"
Pattern pattern = Pattern.compile(rangePattern);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
result.add(matcher.group(1));
result.add(matcher.group(3));
}
return result;
}
顺便说一句 - 不需要检索字符串数组。字符串列表是首选。
推荐阅读
- django - 覆盖 Django Material Admin 模板并将其保存在项目文件夹中
- javascript - 无法仅选择单个材质 ui 复选框
- javascript - 在 javascript 中解析嵌套级别 Json
- scala - 如何从依赖项中删除 SparkUI 和 Hbase-webapp?
- excel - 无法找到将数据存储到类模块内的数组中的方法
- python - DirectX 游戏的自动点击程序
- twitter-bootstrap-3 - 即使格式化,Bootstrap3 datetimepicker 也会显示日历?
- python - 试图找到 FP,FN,TP,TN 但我遇到了一些错误
- automation - 我在 MOCHA-Chai 的调用 API 中使用了断言
- asp.net-core - 错误请求,标头太长,错误代码 400(使用 IIS 服务器 .netCore 应用程序运行)