比较两个字符串时,String.equals-method始终返回false

时间:2019-02-01 16:43:18

标签: java arrays string equals morse-code

我上大学的任务是编写摩尔斯电码解码器。我有String-Array,其中包含“摩尔斯字母表”的每个字母。在for循环中,我使用substring方法将morsecode中的句子剪切为“ morseletters”。我编写了另一个for循环和if语句,以检查“摩尔斯字母”中的哪个字母与当前“摩尔瑟字母”相匹配。我已经使用了String.equals-method,但是它不起作用。即使两个字符串相同。我还打印了循环中每个String的长度,以检查String是否包含一些不需要的空格。但是,即使字符串看起来相同且长度相同,我的if语句的条件也永远不会成立。问题似乎是平等的方法。我必须更改什么才能使代码正常工作?

public class Morse {
private static String[] morsecodes = { ".-", "-...", "-.-.", "-..", ".",
         "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.",
         "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--",
         "-..-", "-.--", "--.." }; 

public static void  main (String args[]) {
    System.out.println(decodeMorseCode(".... . .-.. .-.. --- .-- --- .-. .-.. -.."));       
}
public static String decodeMorseCode(String morseText) {
    String realText = "";
    String morseLetter = "";
    int counter = 0;

    for(int i = 0; i < morseText.length(); i++) {   
        if((morseText.charAt(i)==' ')) {
            morseLetter = morseText.substring(counter,i);
            counter = i+1;
        }
        if(morseText.charAt(i)==' '||i+1==morseText.length()) {
            for (int j = 0; j < 26; j++) {
                if((morsecodes[j].equals(morseLetter))) { //this is the if-statemen which causes the problem
                    char c = (char)(j+97);
                    realText += c;
                }

                if(j+1<=morseText.length()) {
                    if(morseText.charAt(j)==' '&& morseText.charAt(j+1)==' ') {
                        realText += " ";
                    }
                }

            morseLetter = "";
            }
        }           
    }
    return realText;
}

}

2 个答案:

答案 0 :(得分:0)

如下所示删除morseLetter = "";行,您的代码即可使用。

    if(morseText.charAt(i)==' '||i+1==morseText.length()) {
        for (int j = 0; j < 26; j++) {
            if(morsecodes[j].equals(morseLetter)) { //this is the if-statemen which causes the problem
                char c = (char)(j+97);
                realText += c;
            }

            if(j+1<=morseText.length()) {
                if(morseText.charAt(j)==' '&& morseText.charAt(j+1)==' ') {
                    realText += " ";
                }
            }
            //morseLetter = "";
        }
    }           

答案 1 :(得分:0)

已经有一些答案了,但是也许您会考虑使用这种方法:

public static String decodeMorseCode(String morseText) {
    String realText = "";
    String morseLetter = "";
    int counter = 0;
    List<String> morseMessage;

    //Easier splitting of the String with morse code
    String[] morseLetters = morseText.split(" ");
    morseMessage = Arrays.asList(morseLetters);

    for (String morse : morseMessage) {
        for (String letter : morsecodes) {
            if (morse.equals(letter)) {
                System.out.println(letter);
                //Here comes mapping from Morse-to-English.
            }
        }
    }
    return realText;
}

我在这里所做的是引入一个列表,该列表可以按字母逐个存储您的消息,并使其更容易遍历。首先将字符串拆分为包含单个字母的数组,然后将其转换为列表。然后,我将摩尔斯电码消息中的每个字母与您的摩尔斯电码“字典”进行比较,如果运行此代码,您将看到它能够识别每个字母。

剩下的是创建一个地图,以将摩尔斯电码表示形式转换为英文字母。 注意:也许最好不要使用一系列摩尔斯电码,但最好将其作为带有英语映射的地图?

例如:

private static Map<Character, String> morseToEnglish;

public static void  main (String[] args) {
    morseToEnglish = new HashMap<Character, String>();
    morseToEnglish.put('a', ".-");
    morseToEnglish.put('b', "-...");
    morseToEnglish.put('c',  "-.-");
    morseToEnglish.put('d',  "-..");
    ...

然后循环映射:

    for (String morse : morseMessage) {
        for (String letter : morseToEnglish.values()) {
            if (morse.equals(letter)) {
                for (Character character : morseToEnglish.keySet()) {
                    if (morseToEnglish.get(character).equals(letter)) {
                        System.out.print(character);
                    }
                }
            }
        }
    }

您使用莫尔斯电码编码的邮件为'helloworld'