簡體   English   中英

用Java替換字符串中字符的問題

[英]Problems with replacing characters in a string in Java

我想制作一個“莫爾斯電碼翻譯器”程序,但是有一個問題。

我想要這樣的東西:當我們輸入莫爾斯電碼時,應將其翻譯為英語,而當我們輸入英文文本時,應返回莫爾斯電碼,並且我使用“Ⓐ”代替A。

我的問題是將莫爾斯電碼翻譯成英文。

當我輸入“ .---”時,它應該顯示“Ⓙ”,但是它顯示“Ⓐ”,因為它們的第一部分相似。

我該怎么做才能解決這個問題?

這是我遇到問題的部分代碼:

.replace(".-", "Ⓐ"))
.replace(".---", "Ⓙ"))
.replace("a", ".-  "))
.replace("j", ".---  "))

這是因為:

這個:

.replace(".-", "Ⓐ"))

也發生在這里:

.replace(".---", "Ⓙ"))

考慮大約2個字符串:

.-.-.-.-.-

.---.---

當您使用第一次替換(例如replaceAll)時,字符串將如下所示:

ⒶⒶⒶⒶⒶ

Ⓐ--Ⓐ--

原因.-在第一個和第二個字符串內。

為了避免這種情況,您可以使用Regex為例

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

或反轉替換,但這是一個不好的做法(組合太多,您無法檢查所有內容。一個好主意是將所有內容拆分為mors代碼塊,然后檢查這些字符串是否等於1:1。

所以你會有

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

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

然后,當您檢查是否等於:

.-等於.-? 正確,替換

.---等於.-? 錯誤,請勿替換

像這樣:

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

        }
    }
}

問候

private static String[][] MORSE_TABLE = {
    {".-", "Ⓐ"},
    {".---", "Ⓙ"},
    {"--...", "7"},
    {"---", "O"},
    {"...", "S"},
    ...
};

問題在於,應該首先嘗試轉換最長的序列,否則將永遠無法翻譯更長的序列。

但是,這仍然是模棱兩可的:您有A7還是J 因此,在這些情況下,停頓(空格)非常有用。

// Sorting on decreasing morse length:
static {
    Arrays.sort(MORSE_TABLE,
        (pair1, pair2) -> -Integer.compare(pair1[0].length(),
                                          pair2[0].length());
}

然后從頭開始並進行順序替換:

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

如上所示,模棱兩可的解析也是可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM