Вы должны попытаться написать код, документирующий намерение читателя.Поэтому, когда задание включает условие «для каждой буквы в диапазоне GO / Go», не пишите код, такой как
public static boolean isInRange(char c) {
return (((int)c >= 72 && (int)c <= 78) || ((int)c >= 104 && (int)c <= 110));
}
Запись
public static boolean isInRange(char c) {
return c > 'G' && c < 'O' || c > 'g' && c < 'o';
}
, что сразу делает очевидным, чтоВы говорите о диапазоне «GO / go (эксклюзивный)», а не «HN / hn (включительно)», а не о ненужном использовании чисел Юникод / ASCII вместо записи констант символов.Код все равно будет делать то же самое, но теперь вы можете распознать исходную задачу в нем.Приведения типов не нужны ни в одном из вариантов.
Как подсказал Андреас в этом комментарии , вам не нужен счетный цикл для нахождения разницы, для этого и нужен минус.Таким образом, flipLetter
упрощается до
if(c > 'G' && c < 'O') {
return (char)('Z' - (c - 'A'));
}
if(c > 'G' && c < 'O') {
return (char)('z' - (c - 'a'));
}
, но когда мы используем это после того, как диапазон уже проверен, мы можем выразить намерение провести различие между прописными и строчными буквами напрямую, используя Character.isUpperCase(…)
или Character.isLowerCase(…)
.
Кроме того, основные арифметические правила говорят нам, что 'Z' - (c - 'A')
- это то же самое, что и ('Z' + 'A') - c
, аналогично для варианта в нижнем регистре, поэтому код для двух случаев отличается только одним постоянным значением.
Помещение этих результатов в операцию Stream приводит к
public static void yourTask(char[] arr) {
CharBuffer.wrap(arr).chars()
.filter(c -> c >= 'H' && c <= 'N' || c >= 'h' && c <= 'n')
.map(c -> (Character.isUpperCase(c)? 'A'+'Z': 'a'+'z') - c)
.forEachOrdered(ch -> System.out.print((char)ch+" "));
}
(имя метода, например inRange
, звучит как тест, поэтому вы должны придумать лучшее имя, описывающее, что метод на самом деле делает)
Обратите внимание, что здесь используется IntStream
, поскольку в Java нет CharStream
, что хорошо, как в Java, вычисления с использованием значений char
в любом случае выполняются с использованием int
.Только в заключительном операторе печати нам нужно выполнить приведение типа к char
, чтобы установить правильную семантику, которая влияет на способ печати значения.