Метод String.equals всегда возвращает false при сравнении двух строк - PullRequest
0 голосов
/ 01 февраля 2019

Моя задача для университета заключалась в том, чтобы кодировать азбуку Морзе.У меня есть String-Array с каждой буквой "азбуки Морзе".В цикле for я вырезал предложение в коде morsecode на его "morseletters", используя метод substring-метода.Я сделал еще один цикл for и оператор if, чтобы проверить, какая буква из «азбуки Морзе» соответствует текущей «букве».Я использовал метод String.equals, но он не работает.Даже если две строки одинаковы.Я также напечатал длину каждой строки в цикле, чтобы проверить, не содержат ли строки нежелательные пробелы.Но даже если строки выглядели одинаково и имели одинаковую длину, условие моего оператора 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 голосов
/ 01 февраля 2019

Уже есть ответы на некоторые вопросы, но, возможно, вы захотите рассмотреть этот подход:

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'.

0 голосов
/ 01 февраля 2019

Удалите строку 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 = "";
        }
    }           
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...