если оператор возвращает неверный вывод при сравнении KeyEvent .getText и индекса в массиве javafx

#javafx #controller #fxml #scenebuilder

Вопрос:

Я пытаюсь проверить, совпадает ли ввод (в виде нажатий клавиш) от пользователя со строкой textToType , которая была разбита на массив символов. Проблема в том, что, хотя они оба возвращают одно и то же значение, когда я сравниваю их, это все равно даст результат wrong letter .

Выход

 index splitter [0] returned: t
event.getText returned: t
wrong letter
 
 @FXML
private void detectInputAreaKeyEvent(KeyEvent event) {
    char[] splitter = textToType.toCharArray();

    System.out.println("index splitter [0] returned: "   splitter[0]);
    System.out.println("event.getText returned: "   event.getText());

    if (event.getText().equals(splitter[0])) {
        System.out.println("right letter");
    }
    else {
        System.out.println("wrong letter");
    }
 

Комментарии:

1. event.getText() является a String , в то splitter[0] время как является a char (который автоматически преобразуется в a Character ). Поскольку они разные типы, они не могут быть равными. Вы можете сделать или event.getText().equals(textToType.substring(0,1)) или event.getText().charAt(0) == splitter[0] и т. Д.

2. Еще один неэффективный способ-создать новую строку(разделитель[0])

Ответ №1:

TLDR: вы сравниваете a String с a char , поэтому они не равны.


KeyEvent.getText() возвращает a String и splitter[0] является примитивным типом char .

Так String.equals(...) как ожидает ан Object , поэтому, когда вы позвоните

 event.getText().equals(splitter[0])
 

splitter[0] автоматически привязывается к объекту-оболочке типа Character . Следовательно, вы сравниваете а String с а Character . В String.equals() документации говорится

Результат является истинным тогда и только тогда, когда аргумент не равен нулю и является строковым объектом

(мое ударение). Поскольку вы предоставляете Character экземпляр, а не String экземпляр, результат equals() является ложным.

Вы можете исправить это, сравнив вещи одного и того же типа:

 if (event.getText().charAt(0) == splitter[0])
 

или

 if (event.getText().equals(textToType.substring(0,1)))
 

(первый, вероятно, несколько более эффективен).