Упрощение / оптимизация массивных операторов if ... else if ... else - PullRequest
1 голос
/ 03 августа 2020

Хорошо, по сути, у меня есть код, который использует метод contains () для обнаружения наличия определенных c символов в двух строках. Для дополнительного контекста, этот вопрос является хорошим источником информации о том, какая у меня проблема (и третье решение - это тоже то, что я искал). Тем не менее, вот некоторые из моих кодов:

// code up here basically just concatenates different
// characters to Strings: stringX and stringY

if (stringX.contains("!\"#")) {
} else if (stringX.contains("$%&")) {
} else if (stringX.contains("\'()")) {
} else if (stringX.contains("!$\'")) {
} else if (stringX.contains("\"%(")) {
// literally 70+ more else-if statements
}

if (stringY.contains("!\"#")) {
} else if (stringY.contains("$%&")) {
} else if (stringY.contains("\'()")) {
} else if (stringY.contains("!$\'")) {
} else if (stringY.contains("\"%(")) {
// literally 70+ more else-if statements, all of which are
// exactly the same as those working with stringX
}

Я все еще новичок в программировании Java, поэтому я не уверен, как мне go относиться к этому. Может, это не проблема? Кроме того, если бы я мог исправить это без использования RegEx, это было бы предпочтительнее; Я не очень разбираюсь в этом на данный момент. Но если единственным рациональным решением было бы использовать его, я, очевидно, так и сделаю.

Edit: код во всех этих операторах else-if вообще не будет сильно отличаться друг от друга; в основном просто System.out.println() с некоторой информацией о том, какие символы содержит stringX / stringY.

Ответы [ 2 ]

3 голосов
/ 03 августа 2020

Написание одного и того же кода более одного раза должно немедленно вызвать тревогу в вашей голове, чтобы переместить этот код в функцию, чтобы его можно было повторно использовать.

Что касается упрощения выражения, лучший подход, вероятно, - сохранить шаблоны, которые вы ищете в виде массива, и повторение массива с вашим условием.

private static final String[] patterns = new String[] {"!\"#", "$%&", "\'()", "!$\'", "\"%(", ...};

private static void findPatterns(String input) {
    for (String pattern : patterns) {
        if (input.contains(pattern) {
            System.out.println("Found pattern: " + pattern);
        }
    }
}

// Elsewhere...
findPatterns(stringX);
findPatterns(stringY);

Этот шаблон особенно распространен в функциональных языках и языках функционального стиля. Java 8 потоков являются хорошим примером, так что вы могли бы эквивалентно

List<String> patterns = Arrays.asList("!\"#", "$%&", "\'()", "!$\'", "\"%(", ...);
patterns.stream()
    .filter(pattern -> stringX.contains(pattern))
    .forEach(pattern -> System.out.println("Found pattern: " + pattern));
3 голосов
/ 03 августа 2020

может просто составить список вашего дела. затем использование java 8 потокового фильтра

List<String> pattems = Arrays.asList("!\"#", "$%&", ...);
Optional<String> matched = pattems.stream().filter(p -> stringX.contains(p));
if(matched.isPresent()) {
   System.console().printf(matched.get())
}

java stream может сделать вашу производительность медленнее , но не слишком

...