java.lang.StringIndexOutOfBoundsException:字符串索引超出范围错误-Morse到英语java代码

java.lang.StringIndexOutOfBoundsException:字符串索引超出范围错误-Morse到英语java代码,java,Java,我正在研究摩尔斯电码到英语java电码(见下文),其中| in Morse代表字母和数字之间的空格,而Morse中的空格代表两个字母或数字之间的空格。例如,摩尔斯电文中的“to be”=“--|-…” // Import Scanner. import java.util.Scanner; public class Project1_szhu1249322 { public static void main(String[] args) { Scanner input

我正在研究摩尔斯电码到英语java电码(见下文),其中| in Morse代表字母和数字之间的空格,而Morse中的空格代表两个字母或数字之间的空格。例如,摩尔斯电文中的“to be”=“--|-…”

// Import Scanner.
import java.util.Scanner;

public class Project1_szhu1249322
{
    public static void main(String[] args)
    {
    Scanner input = new Scanner (System.in);
    System.out.println("Would you like to translate 'Morse Code' to English, or 'English' to Morse code? (Enter 'Morse Code' or 'English'.)");
    String unit1 = input.nextLine();
    System.out.println("Enter a string of " + unit1 + " characters (for English, numbers and letters, only): ");
    String amountUnit1 = input.nextLine();
    if (unit1.equals("Morse Code"))
        toEnglish(amountUnit1);
    else if (unit1.equals("English"))
        toMorseCode(amountUnit1);
    else
        System.out.println("Invalid data. Enter 'Morse Code' or 'English' without the single quotes.");
}

    public static void toMorseCode(String english)
{
    // Declare variables, arrays, and strings.
    int i = 0;
    int l = english.length();
    int i2 = 2 * i;
    String[] lowerAlphabet = {"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","1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};
    String[] upperAlphabet = {"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","1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};
    String[] morseCode = {".-", "-...", "-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",".----","..---","...--","....-",".....","-....","--...","---..","----.","-----"};
    morseCode[i] = lowerAlphabet[i];
    StringBuilder morseBuilder = new StringBuilder();

    // for loops and if statements for result.
    for (i = 0; i < l; i++)
    {
        i2 = 2 * i;
        if (english.charAt(i) != ' ')
            morseBuilder.append(morseCode[i2]);
        else
            morseBuilder.append('|');

        if (morseBuilder.charAt(i - 1) != ' ' && morseBuilder.charAt(i + 1) != 0)
            morseBuilder.append(' ');
    }

    morseCode[i] = upperAlphabet[i];
    // for loops and if statements for result.
    for (i = 0; i < l; i++)
    {
        i2 = 2 * i;
        if (english.charAt(i) != ' ')
            morseBuilder.append(morseCode[i2]);
        else
            morseBuilder.append('|');

        if (morseBuilder.charAt(i - 1) != ' ' && morseBuilder.charAt(i + 1) != 0)
            morseBuilder.append(' ');
    }

    // Display results.
    System.out.println("The corresponding Morse code is " + morseBuilder + ".");
}

public static void toEnglish(String morse)
{
    // Declare variables, arrays, and strings.
    int i = 0;
    int l = morse.length();
    int i2 = i / 2;
    String[] lowerAlphabet = {"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","1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};
    String[] upperAlphabet = {"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","1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};
    String[] morseCode = {".-", "-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",".----","..---","...--","....-",".....","-....","--...","---..","----.","-----"};
    morseCode[i] = upperAlphabet[i];
    String english;

    StringBuilder englishBuilder = new StringBuilder();

    // for loops and if statements for result.
    for (i = 0; i < l; i++)
    {
        i2 = i / 2;
        if (morse.charAt(i) == '|')
        {
            englishBuilder.append(' ');
        }
        else
            englishBuilder.append(morseCode[i2]);
    }

    morseCode[i] = lowerAlphabet[i];
    // for loops and if statements for result.
    for (i = 0; i < l; i++)
    {
        i2 = i / 2;
        if (morse.charAt(i) == '|')
        {
            englishBuilder.append(' ');
        }
        else
            englishBuilder.append(morseCode[i2]);
    }

    // Display results.
    System.out.println("The corresponding English is " + englishBuilder + ".");
    }
}
我不明白为什么它会给我这个错误信息


另外(问题2),我应该使用什么i2值?i/2仅适用于即使是i(当第一个字符不是空格时。帮助???

i==0
您的代码有多个危险点时,您在
i=0
此代码
charAt(i-1)
上失败。
同样在函数
toEnglish
中,循环完成后,
i
的值将等于
l
,以便下一行
morseCode[i]=lowerlphabet[i];
如果您的
morse
字符串的长度
morseCode
lowerAlphabet

使用地图映射字母“A”、“B”以此类推到他们的莫尔斯计数器部件,反之亦然,将莫尔斯转换为英语。这使您知道在两者之间转换时使用什么。请尝试以下操作,并根据您的需要对其进行修改

public static void main(String[] args) throws IOException 
{
    String userInput = "Hello World";
    String converted = ConvertEnglishToMorseCode(userInput);

    System.out.println(userInput + " in Morse Code is " + converted);

    System.out.println(converted + " in English is " + ConvertMorseCodeToEnglish(converted));
} //end main

public static String ConvertMorseCodeToEnglish(String input)
{
    String[] upperAlphabet = {"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","1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};
    String[] morseCode = {".-", "-...", "-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",".----","..---","...--","....-",".....","-....","--...","---..","----.","-----"};
    HashMap<String, String> morseToEnlgish = new HashMap<>();

    for(int i = 0; i < upperAlphabet.length; i++)
        morseToEnlgish.put(morseCode[i], upperAlphabet[i]);

    String morseToEnglish = "";
    String[] morseSplit = input.split(" ");

    for(int i = 0; i < morseSplit.length; i++)
    {
        morseToEnglish += morseToEnlgish.containsKey(morseSplit[i]) ? morseToEnlgish.get(morseSplit[i]) : " ";
    }

    return morseToEnglish;
}

public static String ConvertEnglishToMorseCode(String input)
{
    String[] upperAlphabet = {"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","1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};
    String[] morseCode = {".-", "-...", "-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",".----","..---","...--","....-",".....","-....","--...","---..","----.","-----"};
    HashMap<String, String> englishToMorse = new HashMap<>();

    for(int i = 0; i < upperAlphabet.length; i++)
        englishToMorse.put(upperAlphabet[i], morseCode[i]);

    String[] letters = input.toUpperCase().split("");

    String englishToMorseWord = "";

    for(int i = 0; i < letters.length; i++)
    {
        englishToMorseWord += englishToMorse.containsKey(letters[i]) ? englishToMorse.get(letters[i]) : "|";
        if(i < letters.length - 1)
            englishToMorseWord += " ";
    }

    return englishToMorseWord;
}
请注意这两种语言在转换上的细微差别。对于英语,我们围绕“”拆分,以获得每个字符本身并使用映射。对于将摩尔斯电码转换为英语,我们围绕“”拆分因为我假设给你的摩尔斯电码中的字母是你在将英语单词转换为摩尔斯电码时输出的格式,空格是分开的。最后,当我们从英语转换为摩尔斯电码,并且没有映射时,我们在从摩尔斯电码转换为英语时,会填写“|”和一个“”

祝你好运

public static void main(String[] args) throws IOException 
{
    String userInput = "Hello World";
    String converted = ConvertEnglishToMorseCode(userInput);

    System.out.println(userInput + " in Morse Code is " + converted);

    System.out.println(converted + " in English is " + ConvertMorseCodeToEnglish(converted));
} //end main

public static String ConvertMorseCodeToEnglish(String input)
{
    String[] upperAlphabet = {"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","1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};
    String[] morseCode = {".-", "-...", "-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",".----","..---","...--","....-",".....","-....","--...","---..","----.","-----"};
    HashMap<String, String> morseToEnlgish = new HashMap<>();

    for(int i = 0; i < upperAlphabet.length; i++)
        morseToEnlgish.put(morseCode[i], upperAlphabet[i]);

    String morseToEnglish = "";
    String[] morseSplit = input.split(" ");

    for(int i = 0; i < morseSplit.length; i++)
    {
        morseToEnglish += morseToEnlgish.containsKey(morseSplit[i]) ? morseToEnlgish.get(morseSplit[i]) : " ";
    }

    return morseToEnglish;
}

public static String ConvertEnglishToMorseCode(String input)
{
    String[] upperAlphabet = {"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","1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};
    String[] morseCode = {".-", "-...", "-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",".----","..---","...--","....-",".....","-....","--...","---..","----.","-----"};
    HashMap<String, String> englishToMorse = new HashMap<>();

    for(int i = 0; i < upperAlphabet.length; i++)
        englishToMorse.put(upperAlphabet[i], morseCode[i]);

    String[] letters = input.toUpperCase().split("");

    String englishToMorseWord = "";

    for(int i = 0; i < letters.length; i++)
    {
        englishToMorseWord += englishToMorse.containsKey(letters[i]) ? englishToMorse.get(letters[i]) : "|";
        if(i < letters.length - 1)
            englishToMorseWord += " ";
    }

    return englishToMorseWord;
}
Hello World in Morse Code is .... . .-.. .-.. --- | .-- --- .-. .-.. -..
.... . .-.. .-.. --- | .-- --- .-. .-.. -.. in English is HELLO WORLD