Разделение строки, запоминание разделителя и добавление его в качестве пробела - PullRequest
0 голосов
/ 18 ноября 2018

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

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

....x.x.-..x.-..x---xx...x-x.-x-.-.x-.-x---x...-x.x.-.x..-.x.-..x---x.--

один «х» означает, что буква заканчивается в этой точке, дважды«х» означает, что это конец всего слова.У меня есть карта с азбукой Морзе.Я делю строку на «x», затем сравниваю каждую закодированную букву со значениями в моем словаре и добавляю соответствующий ключ в мой StringBuilder, он работает правильно, но я хочу оставить пробелы между словами вместо двойного xx.

Мой кусок кода:

private static final Map<Character, String> morseCode;
    static {
        morseCode = new HashMap<Character, String>();
        morseCode.put('h', "....");
        morseCode.put('e', ".");
        morseCode.put('l', ".-..");
        morseCode.put('o', "---");
        morseCode.put('s', "...");
        morseCode.put('t', "-");
        morseCode.put('a', ".-");
        morseCode.put('c', "-.-.");
        morseCode.put('k', "-.-");
        morseCode.put('v', "...-");
        morseCode.put('r', ".-.");
        morseCode.put('f', "..-.");
        morseCode.put('w', ".--");
    }

String decodedMorseTable = "....x.x.-..x.-..x---xx...x-x.-x-.-.x-.-x---x...-x.x.-.x..-.x.-..x---x.--"
StringBuilder decodedText = new StringBuilder();
String[] splitLetters = decodedMorseTable.split("x");
    for(String letter: splitLetters) {
        for(Map.Entry<Character, String> entry: morseCode.entrySet()) {
            if(entry.getValue().equals(letter))
                decodedText.append(entry.getKey());

Вывод:

hellostackoverflow

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Если я правильно понимаю ваш вопрос, ваш желаемый результат будет выглядеть следующим образом:

hello stackoverflow

Что вы можете попробовать, так это сначала получить индекс всех "xx" с decodedMorseTable.indexOf ("xx")и вставьте пробел в этих местах потом.Но не забудьте сместить вставленный пробел на количество пробелов, вставленных перед ним.

0 голосов
/ 18 ноября 2018

Попробуйте сначала разбить ввод на отдельные слова (по xx). Затем разделите каждое слово, как вы делали раньше:

String decodedMorseTable = "....x.x.-..x.-..x---xx...x-x.-x-.-.x-.-x---x...-x.x.-.x..-.x.-..x---x.--";
StringBuilder decodedText = new StringBuilder();
String[] words = decodedMorseTable.split("xx");
for (String word : words) {
    String[] splitLetters = word.split("x");
    for (String letter : splitLetters) {
        for (Map.Entry<Character, String> entry : morseCode.entrySet()) {
            if (entry.getValue().equals(letter))
                decodedText.append(entry.getKey());
        }
    }
    decodedText.append(" ");
 }

Обновление

Если вы измените свой morseCode, чтобы иметь буквы Морзе в качестве ключей и символы в качестве значений, тогда код будет выглядеть намного проще (без 3-го цикла):

private static final Map<String, Character> morseCode;
static {
    morseCode = new HashMap<>();
    morseCode.put("....", 'h');
    morseCode.put(".", 'e');
    morseCode.put("", ' ');
...   


String[] splitLetters = word.split("x");
for (String letter : splitLetters) {
    decodedText.append(morseCode.get(letter));
}

Java 1.8 + решение:

Arrays.stream(decodedMorseTable.split("x"))
      .map(morseCode::get)
      .forEach(decodedText::append);
...