我正在创建一个项目,将莫尔斯电码翻译成英语和英语为莫尔斯电码。程序应提示用户指定所需的翻译类型,输入一串莫尔斯电码字符或英文字符,然后显示翻译结果。所有大写和小写,数字和标点都可以忽略。请不要使用Hashtables和地图。
我成功地完成了将英语翻译成莫尔斯的部分。然而,在将莫尔斯翻译成英语时,似乎会发生很多错误。但我无法弄清楚原因。
所以任何读过这篇文章的人,如果你帮我解决错误,我会非常感激!任何帮助表示赞赏。非常感谢你!
控制台上显示的错误消息是:
线程中的异常" main" java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:3 at java.lang.String.substring(String.java:1950) 在Project1.MoToEng(Project1.java:57) 在Project1.main(Project1.java:30)
public class Translator
{
public static String[] morse = { ".- ", "-... ", "-.-. ", "-.. ", ". ",
"..-. ", "--. ", ".... ", ".. ",
".--- ", "-.- ", ".-.. ", "-- ", "-. ", "--- ", ".--. ", "--.- ",
".-. ", "... ", "- ", "..- ",
"...- ", ".-- ", "-..- ", "-.-- ", "--.. ", "|" };
public static String[] alphabet = { "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", " " };
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Input '1' to translate English to Morse Code.");
System.out.println("Input '2' to translate Morse Code to English.");
int kind = in.nextInt();
if (kind == 1) {
System.out.println("Please insert an alphabet string");
String Eng = in.next();
EngToMo(Eng);
}
if (kind == 2) {
System.out.println("Please insert a morse string");
String Mor = in.next();
MoToEng(Mor);
}
}
public static void EngToMo(String string1) {
String Upper1 = string1.toUpperCase();
for (int i = 0; i < Upper1.length(); i++) {
char character1 = Upper1.charAt(i);
if (character1 != ' ') {
System.out.print(morse[character1 - 'A'] + " ");
} else {
System.out.println(" | ");
}
}
}
public static void MoToEng(String string2) {
int x = 0;
int y = 1;
String space = " ";
for (int i = 0; i < string2.length(); i++) {
if(string2.substring(x,y).equals(space)){
x++;
y++;
}
else{
y++;
if(string2.substring(x,y).equals(morse[i])){
System.out.println(alphabet[i]+ " ");
}
}
}
}
}
答案 0 :(得分:0)
此代码存在一些问题。
第一个是造成异常的原因,
因为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] + " ");
}
}
}
}
}
注意:您可能会遇到问题,因为您用来从system.in读取的扫描仪将进行标记,并且只能为您提供第一个空格。因此,如果您使用Scanner类,则只需要
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();
}
}
显然你可以按照user902383的建议使用数组列表,拆分函数和indexOf,但这个答案只是为了纠正代码中的崩溃。
答案 1 :(得分:0)
我简化了您的方法MoToEng
,您需要将morse
更改为列表,并且还从条目中删除了空格
public static List<String> morse = Arrays.asList(".-", "-...", "-.-.",
"-..", ".", "..-.", "--.", "....", "..",
"--..", "|");
您需要在System.out.print(morse[character1 - 'A'] + " ");
中将System.out.print(morse.get(character1 - 'A') + " ");
更改为EngToMo
,然后才会有效
这应该让它发挥作用
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] + " ");
}
}
}