首页 > 解决方案 > 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 };
}

标签: javarefactoringjava-7

解决方案


有一种更好的方法可以实现您的目标:

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;
}

顺便说一句 - 不需要检索字符串数组。字符串列表是首选。


推荐阅读