Сравнивая строку со значением в Map <Character, String> и возвращая ее ключ - PullRequest
0 голосов
/ 16 ноября 2018

Всем доброго времени суток!

У меня есть карта с ключами в виде символов и их значениями в виде строк, она выглядит следующим образом (Baconian Cipher):

public class MyClass {

private static final Map<Character, String> cipheredAlphabet;
    static {
        cipheredAlphabet = new HashMap<Character, String>();
        cipheredAlphabet.put('a', "AAAAA");
        cipheredAlphabet.put('s', "BAABA");
    }
}

У меня есть строка, котораявыглядит следующим образом:

String encodedMessage = "BAABAAAAAA";

Я хочу перебрать его по 5 букв за раз:

StringBuilder decodedMessage = new StringBuilder();
for(int i=0; i<encodedMessage.length(); i+=5) {
    String fiveLetters = encodedMessage.substring(i, i+5);
    // compare five letters to values and append the corresponding key

}

Как я могу сравнить эти пять букв со значениями на карте и добавить кмой StringBuilder соответствующий ключ?

Ожидаемый вывод:

sa

Используя информацию из документации, я придумал что-то вроде этого:

StringBuilder decodedMessage = new StringBuilder();
    for(int i=0; i<encodedMessage.length(); i+=5) {
        String fiveLetters = encodedMessage.substring(i, i+5);
        // pseudo code starts from this point
        for(Map.Entry<Character, String> entry: cipheredAlphabet.entrySet()) {
            if(cipheredAlphabet.getValue().equals(fiveLetters))
            decodedMessage.append(cipheredAlphabet.getKey());

1 Ответ

0 голосов
/ 16 ноября 2018
for(Map.Entry<Character, String> entry: cipheredAlphabet.entrySet()) {
    if(entry.getValue().equals(fiveLetters)) {
        ecodedMessage.append(cipheredAlphabet.getKey());
        break;
    }
}

Но я думаю, что намного лучше поменять местами ключи и значения на карте.

public class MyClass {

    private static final Map<String, Character> MAP = new HashMap<>();

    static {
        MAP.put("AAAAA", 'a');
        MAP.put("BAABA", 's');
    }

    public String decode(String msg) {
        if (msg == null || msg.length() % 5 != 0)
            throw new IllegalArgumentException("Message length should be a multiple of 5");

        StringBuilder buf = new StringBuilder();

        for (int i = 0; i < msg.length(); i += 5) {
            String letters = msg.substring(i, i + 5);
            Character ch = MAP.get(letters);

            if (ch == null)
                throw new IllegalArgumentException("Letters '" + letters + "' not found in local map");

            buf.append(ch);
        }

        return buf.toString();
    }
}
...