Как реализовать это без использования endless else, если

поэтому мне нужно зашифровать и расшифровать с помощью этой кодовой книги.

cijuskla .... т, их 26. поэтому c становится a, i становится b, j становится c ... и t становится z.

У меня такой же набор для заглавных букв.

Первое, что пришло мне в голову, это использование бесконечного else if.

for(int i = 0; i < input.length(); i++) {
    if input.charAt[i] == 'a' {
         input.charAt[i] == 'c' }
    else if input.charAt[i] ==

есть ли лучший способ сделать это мне не хватает ??

как насчет заявления switch? или просто использовать предопределенный HashMap со всеми сопоставлениями?

Vadim 13.09.2018 18:10

@ мне нужно 50 ящиков, включая заглавные буквы ....

user2998413 13.09.2018 18:11

Карты - это определенно лучший способ, для вдохновения, как инициализировать карту декодирования, посмотрите здесь

fvu 13.09.2018 18:26
0
3
68
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Используйте карту для хранения пары ключ-значение. Найдите значение с помощью ключа input.charAt [i] и замените. Нет необходимости в бесконечном if-else

    String input = "abcde";
    Map<Character, Character> encodedChar = new HashMap<Character, Character>();

    encodedChar.put('a', 'c');
    encodedChar.put('b', 'e');

    char[] tempInput = input.toCharArray();

    for (int i = 0; i < tempInput.length; i++) {
        tempInput[i] = encodedChar.get(tempInput[i]);
    }
    input = new String(tempInput);

Извините, но даже с массивом пар ключей мне не нужно перечислять все в цикле for? не могли бы вы привести мне несколько примеров?

user2998413 13.09.2018 18:15

@ user2998413 карта будет сопоставлять исходные буквы (ключи карты) с закодированными буквами (значениями карты), поэтому вам просто нужно получить значение, связанное с вашей входной буквой, чтобы получить ее закодированную версию. Все сопоставления будут описаны в карте из 26 записей вместо огромного if / then / else.

Aaron 13.09.2018 18:21

В качестве альтернативы вы можете использовать два массива: один со стандартным алфавитом, второй с закодированным алфавитом (cijuskla....t); вы ищите индекс введенной буквы в стандартном алфавите, а затем выводите символ в той же позиции в закодированном алфавите. Версия карты позволяет сделать это только более оптимизированным способом.

Aaron 13.09.2018 18:24

@ Аарон, да, я давал два массива, но все еще застрял, я еще не изучил хеш ...

user2998413 13.09.2018 18:29

@ user2998413 Пример добавлен.

Ashraff Ali Wahab 13.09.2018 19:01

Я пробовал, и код будет таким, как показано ниже. Некоторые комментарии к коду для ясного понимания:

//add all letters key value pair to this list
final HashMap<Character, Character> letterMapForDecrypt = new HashMap<>();
letterMapForDecrypt.put('c', 'a');
letterMapForDecrypt.put('d', 'b');
letterMapForDecrypt.put('f', 'k');
letterMapForDecrypt.put('h', 'j');

//adding reverse type of decrpyt letter list
final HashMap<Character, Character> letterMapForEncrypt = new HashMap<>();
letterMapForDecrypt.forEach((key, value) -> letterMapForEncrypt.put(value, key));

//decrpyte
String stringToDecrypt = "cddfh";
final char[] charsOfDecrpyt = stringToDecrypt.toCharArray();
for (int i = 0; i < charsOfDecrpyt.length; i++) {
    //get value map and change this char
    charsOfDecrpyt[i] = letterMapForDecrypt.get(charsOfDecrpyt[i]);
}

System.out.println(charsOfDecrpyt);


//encrpte
String stringToEncrypt = "cddfh";
final char[] charsOfEncrypt = stringToEncrypt.toCharArray();
for (int i = 0; i < charsOfEncrypt.length; i++) {
    //get value map and change this char
    charsOfDecrpyt[i] = letterMapForEncrypt.get(charsOfDecrpyt[i]);
}

System.out.println(charsOfEncrypt);

Вместо этого вы можете использовать переключатель:

for(int i = 0; i < input.length(); i++) {
    switch (input.charAt[i]) {
        case 'a': input.charAt[i] = 'c';
                  break;
        case 'i': input.charAt[i] = 'b';
                  break;
        //...
        default: break; // nothing to do for the rest
}

Другие вопросы по теме