使用morsecode值替换字符串中的多个不同字符

时间:2018-02-20 15:59:37

标签: java replace

我正在编写一个程序,它将字符串(来自用户的输入)转换为莫尔斯代码。起初我打算使用大量的if和else if语句,但是在java中找到了替换/替换所有函数。事实证明这非常有用。但是,鉴于我平庸的编程技巧,我无法弄清楚如何在同一个字符串中替换多个不同的字符。以下是代码的一部分:

  Scanner reader = new Scanner(System.in);
        System.out.print("Enter the text you want translated to 
Morsecode:");
        String input = reader.nextLine();
        String res = "";
        String[] letters = new String[] {"a", "b", "c", "d", "e", "f",  "g", 
"h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", 
"w", "x", "y", "z"};
        String[] codes = new String[] {".-", "-...", "-.-.", "-..", ".", 
"..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---",  ".-
-.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", 
"-...", "--.."};
        int i=0;
        for (i=0;i<26;i++)
        {

            res = input.replaceAll(letters[i], codes[i]);
        }
        System.out.print(res);

如果我将字符串输入为“aabb”,程序将输出以下结果:“。 - .- bbaa -... -..”,这个结果与期望的结果相差不多(我认为) ,但我不明白“bbaa”来自哪里? 谢谢

编辑:我根据一些答案给出的建议编辑了原始问题。但是,当前codde只打印出已输入程序的字符串

5 个答案:

答案 0 :(得分:2)

您与replaceAll走在正确的轨道上。以下是完成此计划的方法:

  • 制作两个String[]数组 - 一个包含字母,另一个包含相应的莫尔斯代码
  • 创建一个遍历数组的循环,然后调用res = res.replaceAll(letters[i], codes[i]);
  • 替换后应该是空格;否则你无法判断.--...代表ab.- -...)或ws.-- {{1 }})

这两个数组看起来像这样:

...

注意:完成程序的初始版本后,尝试通过生成String[] letters = new String[] {"a", "b", ...}; String[] codes = new String[] {".-", "-...", ...}; 的字符串来找出消除letters数组的方法。字母表中的字母i

答案 1 :(得分:0)

所有更改都必须应用于同一个字符串:

AuthName "Stage"
AuthType Basic
AuthUserFile /var/www/html/.htpasswd
SetEnvIf Request_URI ".*data_sheets.*\.pdf" noauth
SetEnvIf Request_URI "/api/.+" noauth
SetEnvIfNoCase Request_Method OPTIONS noauth

RewriteEngine On
RewriteCond %{THE_REQUEST} \s/api/
RewriteRule ^ - [E=noauth:1]

Order Deny,Allow
Deny from all
Require valid-user
Allow from env=noauth
Allow from env=rewritten
Satisfy Any

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ /index.html [L]

另外,您可以考虑在每个代码之后添加空白用于学习目的:&#34; .-&#34;。

答案 2 :(得分:0)

制作一个HashMap,其中字母为键,莫尔斯代码为值。然后循环输入String并为String中的每个字符添加相应的莫尔斯代码以输出StringBuilder

String input = "Lorem ipsum";

    Map<String, String> charTable = new HashMap<>();
    charTable.put("A", ".-");
    // other characters

    StringBuilder sbOut = new StringBuilder();
    for (int i = 0; i < input.length(); i++) {
        String character = String.valueOf(input.charAt(i));

        sbOut.append(charTable.get(character));
    }

System.out.println(sbOut);

这比具有两个阵列的选项更具可读性和易于调试的好处,我觉得(我还没有测试过它)它也更有效。

答案 3 :(得分:0)

虽然可以使用replaceAll 来完成您的需要,但它远没有效率,因为1)您将在每次替换时创建String实例,并且2)您将必须多次遍历源字符串(对于您替换的每个字符一次)。一种更有效的方法是维护一个StringBuilder实例,您将在其中附加转换后的结果,并使用source.toCharArray()迭代源字符串。此外,为了避免键入多个if语句来替换每个字符,请将Map<Character, String>英文字符映射保留为其Morse等效字符。然后整个替换看起来很简单:

Map<Character, String> translation = new HashMap<>();
map.put('a', "._");
// repeat for each character representation
// this map can be initialized once, e.g. as a static
StringBuilder result = new StringBuilder("");
for (Character c : input.toCharArray()) {
    result.append(translation.get(c));
}
return result.toString();

答案 4 :(得分:0)

我同意,每封单个字母String.replaceAll()都可以正常使用。但是,不要忘记,每次更换时,JVM都会创建新的字符串。因此,对于长字符串,GC有很多对象。

我提议使用String.toCharArray()StringBuilder将给定字符串转换为莫尔斯代码:

public class Morse {
    private static final Map<Character, String> CODE;

    static {
        Map<Character, String> map = new HashMap<>();

        map.put('a', ".-");
        map.put('b', "-...");

        CODE = Collections.unmodifiableMap(map);
    }

    public static String encode(String str) {
        if (str == null)
            return null;

        StringBuilder buf = new StringBuilder();

        for (int i = 0; i < str.length(); i++) {
            String code = CODE.get(str.charAt(i));
            buf.append(code != null ? code : " ");
        }

        return buf.toString();
    }
}