Какой самый простой способ сделать строчные символы заглавными и наоборот?

#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 работают с отдельными символами, а не со всей строкой.