【问题标题】:Incorrect output for Java in a Morse to English programMorse to English 程序中 Java 的输出不正确
【发布时间】:2017-08-14 19:21:53
【问题描述】:

这是我的摩尔斯电码到英语和副 Versa 的分配标准:

  1. 在摩尔斯电码中,|代表空格。
  2. 在摩尔斯电码中,空格代表新的字母或数字。

我的代码编译正确,但输出(运行后)不正确。

// 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 == "Morse Code")
        toEnglish(amountUnit1);
    else if (unit1 == "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 + ".");
}
}

我的输出是这样的:

Would you like to translate 'Morse Code' to English, or 'English' to Morse code? (Enter 'Morse Code' or 'English'.)
English
Enter a string of English characters (for English, numbers and letters, only): 
to be
Invalid data. Enter 'Morse Code' or 'English' without the single quotes.

它不会转到正确的 if-else 分支。它没有转到unit1 == "English",而是转到最后一个else for Invalid Data。

另外,对于toEnglish方法中的for循环,我应该如何设置i2?我需要 i / 2,但前提是第一个字符不是空格。

【问题讨论】:

  • 有人可以解释为什么它确实给了我意外的类型错误吗?我再次面对它,我不知道该怎么办。
  • 问题中的代码是否正是您程序中的代码?以下是我一目了然的错误:morse.charAt(i) = '|' 应该使用== 进行比较。 i2 的值永远不会更新,因此将始终为 0。 morseCode[i] = upperAlphabet[i]; morseCode[i] = lowerAlphabet[i]; 将导致 morseCode[i] = lowerAlphabet[i]; 并且您永远不会看到它是 upperAlphabet[i]。不确定第二个if 语句在toMorseCode 中的意义是什么
  • 您不应该使用 Stack Overflow 为您调试整个程序。 Stack Overflow 用于发布一个问题并获得一个答案。 How To Ask。了解如何使用调试器并逐步执行您的代码。如果您仍然卡住,请发布另一个问题
  • 很抱歉。
  • 第二个 if 是在字符之间留一个空格。

标签: java arrays string


【解决方案1】:

当您创建 translated 字符串时,您应该使用以下内容而不是 charAt() =,后者不允许赋值:

StringBuilder bob = new StringBuilder();

for (...){
    if (...){
        bob.append(character);
    }
}
String english = bob.toString();

此外,i2 将始终等于 0。

这里还有许多其他小错误。继续调试,您最终将解决所有问题。

【讨论】:

  • 能否请您查看我编辑的帖子并解释下一个错误和困惑?谢谢!
【解决方案2】:

morse.charAt(i) 是一个函数,不能站在赋值的左边。如果需要替换字符,先把字符串转成char数组:

 char[] english = morse.toCharArray();
 english[i] = '|';

如果需要,您可以在完成后转换回字符串 (new String(myArray))。阅读String。

这就是错误的原因。正如@Milk 所建议的,当您逐个字符地构建答案时,最合理的方法是通过StringBuilder。与数组不同,StringBuilder 知道如何增长,创建时无需指定大小。

【讨论】:

    【解决方案3】:

    还有一个错误

    Project1_szhu1249322.java:67:错误:不兼容的类型:char 无法转换为 String 莫尔斯电码[i2] = english.charAt(i);

    morseCode[i2] 返回String,而english.charAt(i) 返回原始类型char。更改为 morseCode[i2] = String.valueOf(english.charAt(i)); 将它们都带入 String

    【讨论】:

    • charAt() 返回一个原始的char。您需要将其包装在String.valueOf() 中。
    • 我想这行得通,但由于我对 StringBuilder 更熟悉,所以我使用了 Milk 的答案,尽管有时我仍然会使用你的答案:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多