Почему мой метод возвращает false, даже если условия выполнены верно?

#java

#java

Вопрос:

 public class Lab3Exercises {

public static void main(String[] args){
    Scanner s = new Scanner([System.in](https://System.in));
    System.out.println("Please enter a word to check if it is a palindrome");
    String myP = [s.next](https://s.next)();
    System.out.println(palindrome(myP));
}

public static boolean palindrome(String p){
    String myWord = p;
    String reverseWord = "";
    int i = 1;
    while (i < myWord.length()){
        reverseWord = myWord.charAt(i)   myWord.substring(0, i)   myWord.substring((i   1), myWord.length());
        i  ;
    }
    if (reverseWord.equals(myWord)) {
        return true;
    }
    else{
        return false;   
    }
}
  

Я проверил, и обратное слово точно такое же, как MyWord, но оно каждый раз возвращает false. Я пробовал hannah, racecar и т.д. все они возвращают false

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

1. Имеет ли это какое-либо отношение к лабораторной утилите?

2. Для вашего примера word ханна , значение reverseWord после while цикла равно hhanna .

3. Вы можете упростить свой код, return reverseWord.equals(myWord) он значительно короче, чем тот, который вы используете if-else…

Ответ №1:

Давайте начнем с более простых примеров.

  • Например, если p имеет длину 1 s (палиндром), вы задаете reverseWord значение пустой строки. Поскольку i начинается с 1, оно не меньше длины, поэтому цикл не выполняется. Поскольку пустая строка не равна s , метод возвращает false .
  • Ввод tt (другой палиндром). Вы выполняете цикл один раз, устанавливая reverseWord значение "t" "t" "" = "tt" . В этом случае метод корректно возвращает true.
  • Ввод obo : Вы устанавливаете reverseWord сначала в boo , затем в "oob" ( "o" "ob" "" ), отбрасывая первое значение.

Я думаю, вам нужно еще раз продумать свою логику.

Совет: научитесь использовать отладчик.

Ответ №2:

Ваше условие неверно, потому что способ построения перевернутого слова неверен.

  1. Вы начинаете с i равно 0
  2. Вы переназначаете новое значение на reverseWord в каждом цикле
  3. Способ, которым вы создаете перевернутую строку, для меня совершенно загадка

Хорошим решением было бы следующее (вы пишете код :))

  1. Попробуйте начинать свои циклы с индекса, начинающегося в самом конце исходного слова
  2. Выполняйте цикл до тех пор, пока не достигнете 0, в основном, пока не останется ни одной буквы, к которой можно было бы добавить reverseWord
  3. В каждом цикле добавляйте одну букву в reverseWord вместо результата сложной операции

Ответ №3:

  • Нет необходимости создавать новую ссылку для слова plaindrome, которое вы собираетесь проверить.
  • Вы должны сохранить слово в обратном порядке в переменной reverseWord.
  • Последний индекс массива символов (String) в java на 1 меньше длины строки. Первый индекс равен 0.
  • Итак, цикл while считывает строку с конца, чтобы начать индексировать и сохранять.

     public static boolean palindrome(String p){
    
        String reverseWord = "";
        int i = p.length() - 1;
        while (i >= 0){
           reverseWord  = p.charAt(i);
           i--;
        }
    
        if (reverseWord.equals(p)) {
            return true;
        }
    
        return false; 
    
    }
      

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

1. На мой вкус, слишком много кормления с ложечки. Вы верите, что запрашивающий чему-то учится из этого?

2. Обновлен ответ и что-нибудь еще неясно в ответе?. Вы должны практиковаться, чтобы делать все правильно. Удалено значение false, потому что, если условие удовлетворено, в коде больше ничего не будет выполняться. Оператор Return должен быть конечным оператором любого метода Java.