首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Java中替换字符串中的字符的问题

在Java中替换字符串中的字符的问题
EN

Stack Overflow用户
提问于 2018-07-03 20:38:03
回答 2查看 122关注 0票数 0

我想做一个“摩尔斯电码翻译器”程序,但我有一个问题。

我想要这样的东西:当我们输入摩尔斯电码时,它应该将其翻译成英语,当我们输入英语文本时,它应该返回摩尔斯电码,我使用“A”而不是A。

我的问题是把摩尔斯电码翻译成英语。

当我输入“.-”时,它应该显示“J”,但它显示“A”,因为它们的第一部分是相似的。

我应该怎么做才能解决这个问题?

以下是我在代码中遇到问题的部分:

代码语言:javascript
运行
复制
.replace(".-", "Ⓐ"))
.replace(".---", "Ⓙ"))
.replace("a", ".-  "))
.replace("j", ".---  "))
EN

回答 2

Stack Overflow用户

发布于 2018-07-03 21:41:03

这是因为:

这一条:

代码语言:javascript
运行
复制
.replace(".-", "Ⓐ"))

在这里也会出现:

代码语言:javascript
运行
复制
.replace(".---", "Ⓙ"))

考虑大约2个字符串:

.-.-

.-.

使用first replace (例如replaceAll),则字符串将如下所示:

AAAAA

A-A--

原因。-在第一个和第二个字符串中。

为了避免这种情况,您可以使用正则表达式,例如

https://www.tutorialspoint.com/java/java_regular_expressions.htm

或者颠倒替换,但这是不好的做法(有太多的组合,你不能检查所有的东西。一个不错的想法是将所有内容都拆分到mors代码块中,然后检查这些字符串是否相等。

所以你将会有

代码语言:javascript
运行
复制
1: .-
2: .-
3: .-

1: .---
2: .---
3: .---

然后,当你要检查equals时:

-等于。-?true,则替换

-等于。-?false,不替换

如下所示:

代码语言:javascript
运行
复制
public class Main {
    public static void main(String[] args) {
        String mors = ".-- .- .--- .- .---";
        String[] morsBlocks = mors.split(" ");
        String[] morsDecoded = new String[morsBlocks.length];
        decoder(morsBlocks, morsDecoded);
        for(String decoded: morsDecoded) {
            System.out.print(decoded + " ");
        }
        System.out.println("---EOT---");


    }

    public static void decoder(String[] blocks, String[] decoded) {
        for(int index = 0; index < blocks.length; index++) {
            String block = blocks[index];

            switch(block) {
                case ".--":
                    decoded[index] = "bla";
                    break;
                case ".-":
                    decoded[index] = "test";
                    break;
                case ".---":
                    decoded[index] = "omg";
                    break;
                default:
                    decoded[index] = "UNDEFINED";
                    break;
            }

        }
    }
}

问候

票数 0
EN

Stack Overflow用户

发布于 2018-07-03 22:07:29

代码语言:javascript
运行
复制
private static String[][] MORSE_TABLE = {
    {".-", "Ⓐ"},
    {".---", "Ⓙ"},
    {"--...", "7"},
    {"---", "O"},
    {"...", "S"},
    ...
};

问题是,人们应该首先尝试转换最长的序列,否则永远不会翻译更长的序列。

然而,这仍然是不明确的:您是否有A7J?因此,停顿(空格)在这些情况下非常有用。

代码语言:javascript
运行
复制
// Sorting on decreasing morse length:
static {
    Arrays.sort(MORSE_TABLE,
        (pair1, pair2) -> -Integer.compare(pair1[0].length(),
                                          pair2[0].length());
}

然后从头开始,进行顺序替换:

代码语言:javascript
运行
复制
List<String> results = decode(s);
if (results.isEmpty()) {
    System.out.println("No results");
} else if (results.size() == 1) {
    System.out.println("Result: " + results.get(0));
} else {
    System.out.println("Ambiguous result: " + results);
}

List<String> decode(String morse) {
    morse = morse.trim();
    if (morse.isEmpty()) {
        List<String> results = new ArrayList<>();
        results.add("");
        return results;
    }
    List<String> results = new ArrayList<>();
    for (String m : MORSE_TABLE) {
        if (morse.startsWith(m[0]) {
            List<String> furthers =
                decode(morse.substring(m[0].length));
            for (String further : furthers) {
                results.add(m[1] + further);
            }
        }
    }
    return results;
}

歧义解析也是可能的,如上所示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51154861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档