Java:将英语翻译成摩尔斯电码时出错(不是重复的)
我正在创建一个项目,将摩尔斯电码翻译成英语,并将英语翻译成摩尔斯电码。程序应提示用户指定所需的翻译类型,输入一串莫尔斯电码字符或英语字符,然后显示翻译结果。所有大小写、数字和标点符号都可以忽略。请不要使用哈希表和映射 我成功地完成了将英文翻译成莫尔斯的部分。然而,当把摩尔斯电码翻译成英语时,似乎有很多错误。但我不明白为什么 因此,任何正在阅读本文的人,如果你能帮我解决这个错误,我将不胜感激!任何帮助都将不胜感激。非常感谢你 控制台上显示的错误消息如下: 线程“main”java.lang.StringIndexOutOfBoundsException中的异常:字符串索引超出范围:3 位于java.lang.String.substring(String.java:1950) 在Project1.MoToEng(Project1.java:57) 在Project1.main(Project1.java:30)Java:将英语翻译成摩尔斯电码时出错(不是重复的),java,Java,我正在创建一个项目,将摩尔斯电码翻译成英语,并将英语翻译成摩尔斯电码。程序应提示用户指定所需的翻译类型,输入一串莫尔斯电码字符或英语字符,然后显示翻译结果。所有大小写、数字和标点符号都可以忽略。请不要使用哈希表和映射 我成功地完成了将英文翻译成莫尔斯的部分。然而,当把摩尔斯电码翻译成英语时,似乎有很多错误。但我不明白为什么 因此,任何正在阅读本文的人,如果你能帮我解决这个错误,我将不胜感激!任何帮助都将不胜感激。非常感谢你 控制台上显示的错误消息如下: 线程“main”java.lang.Str
公共类转换器
{
公共静态字符串[]morse={“-”,“-…”,“-.-”,“-…,”,
"..-. ", "--. ", ".... ", ".. ",
".--- ", "-.- ", ".-.. ", "-- ", "-. ", "--- ", ".--. ", "--.- ",
".-. ", "... ", "- ", "..- ",
"...- ", ".-- ", "-..- ", "-.-- ", "--.. ", "|" };
公共静态字符串[]字母={“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”和“};
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
System.out.println(“输入'1'将英语翻译成摩尔斯电码”);
System.out.println(“输入'2'将摩尔斯电码翻译成英语。”);
int kind=in.nextInt();
如果(种类==1){
System.out.println(“请插入字母字符串”);
字符串Eng=in.next();
英格托莫(英语);
}
如果(种类==2){
System.out.println(“请插入莫尔斯字符串”);
字符串Mor=in.next();
MoToEng(铁道部);
}
}
公共静态void EngToMo(字符串string1){
String Upper1=string1.toUpperCase();
对于(int i=0;i
此代码存在一些问题
第一个是导致异常的原因
因为y从1开始,每个循环增加1,所以它将等于最后一次迭代时string2的长度。这意味着,由于字符串的索引为零,它将比字符串中的最后一个索引高一个,因此string2.substring(x,y)会崩溃
其次,您在莫尔斯电码表中包含空格,因此该电码永远无法与字符串中的最后一个莫尔斯电码匹配,因此它永远不会与字符串相匹配
但是,如果只删除字符串-.
中的空格,则它将提前匹配
您可以简单地使用split函数将输入字符串拆分为“
示例代码
public static void MoToEng(String string2) {
int x = 0;
char space = ' ';
for (int y = 1; y <= string2.length(); y++) {
String match = null;
if (y == string2.length()) {
// Reached the end of the string
match = string2.substring(x);
} else if (string2.charAt(y) == ' ') {
// Reached the end of the word
match = string2.substring(x,y);
x = y+1;
if (x == string2.length()) {
x--;
}
}
if (match != null) {
for (int j = 0;j < morse.length;j++) {
if (morse[j].equals(match+" ")) {
System.out.println(alphabet[j] + " ");
}
}
}
}
}
显然,您可以按照用户902383的建议使用数组列表、拆分函数和indexOf,但这个答案只是为了纠正代码中的错误。我简化了您的方法
MoToEng
,您需要将morse
更改为列表,而且我还删除了条目中的空格
public static List<String> morse = Arrays.asList(".-", "-...", "-.-.",
"-..", ".", "..-.", "--.", "....", "..",
"--..", "|");
你有stacktrace吗?对不起,我刚开始学习java,什么是stack trace?@imibis我正在使用的IDE上写着:线程“main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:java.lang.String.substring(String.java:1950)在Project1.MoToEng(Project1.java:58)在Project1.main(Project1.java:31)在控制台中出现的错误是红色的,y从1开始,每次循环时都增加y的值,y的最后一个值将是字符串的长度,这意味着您正在调用子字符串,y比字符串的最后一个索引高一个。我将启动java IDE来实现example@Danny例子created@Danny 此外,您可能希望在EngToMor中添加一些健全性检查,以便当有人将输入字符串
“!#2313451”
for (int j = 0;j < morse.length;j++) {
if (morse[j].equals(string2+" ")) {
System.out.println(alphabet[j] + " ");
}
}
if (kind == 2) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Please insert a morse string");
try {
MoToEng(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
public static List<String> morse = Arrays.asList(".-", "-...", "-.-.",
"-..", ".", "..-.", "--.", "....", "..",
"--..", "|");
public static void MoToEng(String string2) {
int x = 0;
int y = 1;
for (String token : string2.split("\\s+")) {
int index = morse.indexOf(token);
if (index > -1) {
System.out.println(alphabet[index] + " ");
}
}
}