【问题标题】:Splitting the string, memorizing the delimiter and appending it as a space拆分字符串,记住分隔符并将其附加为空格
【发布时间】:2018-11-18 20:21:38
【问题描述】:

大家好,

我有一个看起来像这样的字符串(摩尔斯电码):

....x.x.-..x.-..x---xx...x-x.-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

【问题讨论】:

  • 为什么不拆分在xx的第一个得到单词,然后在x的单词内得到字母呢?
  • 你是什么意思:我想在单词之间保留空格而不是双xx
  • @NiVer 代替双 xx* 抱歉造成混淆
  • @AndyTurner 我已经尝试过这种方式,但似乎我拆分不正确,最终它会检查我的地图,字母之间有空格,并且输出不完全正确跨度>

标签: java string algorithm collections split


【解决方案1】:

首先尝试将输入拆分为单独的单词(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 以将莫尔斯字母作为键,将字符作为值,那么代码看起来会简单得多(避免第三次循环):

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);

【讨论】:

  • 非常感谢,它成功了!我一直试图错误地用双 xx 拆分它,直接用一个单词附加空格并且什么都不做。
  • 很高兴它有帮助!查看我的更新,了解如何优化代码。
  • 请注意,您实际上不需要在 xx 上拆分:morseCode.put("", ' '); 会处理分词,而只在 x 上拆分。
【解决方案2】:

如果我正确理解您的问题,您想要的输出如下所示:

hello stackoverflow

您可以尝试首先使用 decodedMorseTable.indexOf("xx") 获取所有“xx”的索引,然后在这些位置插入一个空格。但请记住将插入的空格偏移它之前插入的空格数。

【讨论】:

  • 是的,没错。谢谢你的提示!这也是个好主意,我不想过多地围绕它跳舞,这就是为什么我一直在寻找“分裂”的解决方案:)
  • 我同意,拆分的解决方案更干净
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多