我正在编写一个程序,它将字符串(来自用户的输入)转换为莫尔斯代码。起初我打算使用大量的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只打印出已输入程序的字符串
答案 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();
}
}