Как избежать, если заявления java7 или сделать код более читабельным - PullRequest
0 голосов
/ 05 февраля 2019

Я работаю над методом синтаксического анализа в java7, поэтому потоки, лямбды не допускаются в моем коде.Код разбирает выражения вроде 1-9, -2--1, 2E-5 - 9E2", где E2 равно 10^2.И в результате синтаксического анализа я получил String[] из двух чисел: первое число диапазона и последнее число.

Чего я хотел бы добиться, это сделать код более читабельным, возможно, избегать, если операторы и измененияпо какой-то схеме.Или изменение алгоритма.Первая идея состоит в том, чтобы переместить каждое из операторов if в другой метод.Но, возможно, есть другой способ.

    /**
 * @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 };
}

1 Ответ

0 голосов
/ 05 февраля 2019

Есть лучший способ достичь своей цели:

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

Кстати - нет необходимости извлекать массив String.Список строк предпочтителен.

...