#java
#java
Вопрос:
Я делаю программу декодера. Инструкции, напечатанные учителем, говорят об этом:
Символы нижнего регистра становятся символами верхнего регистра.
Символы верхнего регистра становятся символами нижнего регистра.
Цифры 0-9 становятся буквой-J
Любые другие символы становятся #
Какой метод будет самым простым и наименее обременительным для ввода и последующего чтения? Я думал об использовании команд if, но имея:
if(let=a||let=b||let=c); //and so on and so forth, rinse and repeat for uppercase letters.
будет действительно нечитаемым и просто убьет мои руки, набирающие текст.
Комментарии:
1. Вы имеете в виду, что хотите писать код самостоятельно, а не использовать API, предоставленный jdk?
2. В библиотеке Java есть методы в
java.lang.Character
классе, чтобы определить, является ли символ прописным, строчным или цифрой. Это значительно упростит вашу жизнь. В нем также есть методы для преобразования в верхний и нижний регистр. Для преобразования цифр в буквы вы можете полагаться на то, что числовое значение цифр и букв находится в одном и том же порядке.3. @saka1029 Да, и? Для обоих примеров это правильно. Я думаю, что для цифр это может быть немного сложно, поэтому, возможно, лучше проверить
ch >= '0' amp;amp; ch <= '9'
, но для букв это не вызовет проблем, потому что методы преобразования символов в нижний и верхний регистр будут обрабатывать это правильно.
Ответ №1:
Поскольку это задание, я просто дам вам подсказку (ни в коем случае не единственный способ сделать это, только один способ). Вы правы, что есть более программный способ сделать это, и это, вероятно, потребует использования того факта, что chars
они легко преобразуются в числа и обратно (тогда Strings
как с ними немного сложнее манипулировать подобным образом). Например, проверьте char
int
сопоставление to на этой странице и посмотрите, не выскакивает ли у вас что-нибудь…
Ответ №2:
В Linux у нас есть tr
команда, которая заменяет символы
nsaravanas@ubuntu:~$ echo "abcdABCD1234" | tr "a-zA-Z0-9" "A-Za-zA-J"
ABCDabcdBCDE
nsaravanas@ubuntu:~$
В Java
мы можем реализовать аналогично tr
замене char
public static void main(String[] args) {
String str = "abcdefghABCDEFGHI1234%*@)@*#amp;";
String from = "a-zA-Z0-9";
String to = "A-Za-zA-J";
final char remaining = '#';
String replaced = tr(from, to, remaining, str);
System.out.println(replaced);
}
private static String tr(String from, String to, char def, String str) {
Map<Character, Character> trMap = buildTRMap(from, to);
return str.chars().mapToObj(ch -> trMap.getOrDefault((char) ch, def) "").collect(Collectors.joining());
}
private static Map<Character, Character> buildTRMap(String from, String to) {
Map<Character, Character> trMap = new HashMap<>();
for (int i = 0; i < from.length(); i ) {
if (i 2 < from.length() amp;amp; from.charAt(i 1) == '-') {
char fromStart = from.charAt(i);
char fromEnd = from.charAt(i 2);
char toStart = to.charAt(i);
char toEnd = to.charAt(i 2);
List<Character> fromL = IntStream.rangeClosed(fromStart, fromEnd).mapToObj(c -> (char) c).collect(Collectors.toList());
List<Character> toL = IntStream.rangeClosed(toStart, toEnd).mapToObj(c -> (char) c).collect(Collectors.toList());
IntStream.range(0, fromL.size()).forEach(in -> trMap.put(fromL.get(in), toL.get(in)));
i = 2;
} else {
trMap.put(from.charAt(i), to.charAt(i));
}
}
return trMap;
}
вывод
ABCDEFGHabcdefghiBCDE########
Комментарии:
1. @Shreyas, A-J до 0-9 не задается в вопросе
Ответ №3:
Это может быть простым решением, о котором можно подумать прямо сейчас:
for(int i=0;i<str.length();i ){//First it checks for numbers 0-9 and replaces them with characters between A to J, else if alphabets found, converts it to uppercase and lowercase, else convert that character to #
if(str.charAt(i)=='0'){
str.setCharAt(i, 'A');
}else if(str.charAt(i)=='1'){
str.setCharAt(i, 'B');
}else if(str.charAt(i)=='2'){
str.setCharAt(i, 'C');
}else if(str.charAt(i)=='3'){
str.setCharAt(i, 'D');
}else if(str.charAt(i)=='4'){
str.setCharAt(i, 'E');
}else if(str.charAt(i)=='5'){
str.setCharAt(i, 'F');
}else if(str.charAt(i)=='6'){
str.setCharAt(i, 'G');
}else if(str.charAt(i)=='7'){
str.setCharAt(i, 'H');
}else if(str.charAt(i)=='8'){
str.setCharAt(i, 'I');
}else if(str.charAt(i)=='9'){
str.setCharAt(i, 'J');
}else if(Character.isLowerCase(str.charAt(i))){
str.setCharAt(i, Character.toUpperCase(str.charAt(i)));
}else if(Character.isUpperCase(str.charAt(i))){
str.setCharAt(i, Character.toLowerCase(str.charAt(i)));
}else{
str.setCharAt(i, '#');
}
}
Ответ №4:
Взгляните на java.lang.Character
.
У него есть такие методы, как Character.isLowerCase('a')
и Character.toUpperCase('a')
.
Комментарии:
1. поймите его вопрос. если у него есть AbcD, он хочет сделать aBCd … просто выполнив upper или lower, он преобразует весь символ
2. Поймите ответ. Методы в
Character
работают с отдельными символами, а не со всей строкой.