2016-02-04 5 views
-3

Я напечатал 2 строки, и они буквально идентичны, никаких пробелов, потому что я их заменил. https://ideone.com/cw07LG Здесь собранПочему .equals() не работает

public class Palindrome{ 
    public static boolean isPalindrome(String word){ 
     int length; 
     String oppositeWord =""; 
     word = word.replace(" ",""); 
     word = word.toLowerCase(); 
     length = word.length(); 

     for(int i=length-1;i>=0;i--){ 
      if(Character.isLetter(word.charAt(i))){ 
       oppositeWord +=word.charAt(i); 
      }else{ 
       word = word.replace(word.charAt(i),'\0'); 
      } 

     } 
     System.out.println(oppositeWord); 
     System.out.println(word); 

     return oppositeWord.equals(word); 

    } 

    public static void main(String[]args){ 
     System.out.println(isPalindrome("Madam, I'm Adam")); 
    } 
} 
+1

Почему вы мутируете слово? – Makoto

+0

Я понятия не имею, о чем вы спрашиваете. – tnw

+0

Не отвечая на ваш вопрос здесь, но я бы не стал обращать это слово и сравнить его. Просто сравните 1-ю букву с последней буквой, затем вторую букву со второй последней буквой и т. Д. – user3437460

ответ

0

Замена символа «\ 0» не то же самое, что и удаление персонажа все вместе. Он не будет отображаться при печати, поэтому они будут выглядеть одинаково, но они все еще существуют и сделают их не равными.

Попробуйте напечатать длины вместе со словами.

0

Эта линия является неправильным:

word = word.replace(word.charAt(i),'\0'); 

Замена символа на \0 не то же самое, как удаление его. Вы хотите что-то вроде этого:

word = word.replace(""+word.charAt(i), ""); 

Однако, как это comment говорит, Есть более эффективные способы, чтобы проверить, если слово палиндром.

Кроме того, я не уверен, почему, но ваш ideone.com показывает другой результат из моей IDE (NetBeans). Ваш показывает:

madamimadam 
madamimadam 
false 

Но Qbrute points out, выход:

madamimadam 
madam i madam 
false 

Это объясняет, почему результат false. Мое лучшее предположение заключается в том, что у вашей онлайновой среды IDE есть некоторые проблемы с преобразованием \0, которое вы добавили в текст, и просто ничего не печатаете.

1

Во-первых, строки Java неизменяемы и не должны управляться символом по символу (поэтому в библиотеке Java есть классы StringBuilder и StringBuffer).

Во-вторых, строки Java на самом деле не эквивалентны char[] в C/C++. Они больше похожи на char* тем, что они указывают на другую память, содержащую фактическую информацию. Изменение неалфавитных символов на '\0' пустые символы не удаляют их из строки. Они не печатаются на экране, но все еще существуют в памяти. (Это один из способов, когда строки Java отличаются от строк C/C++ ... Строки Java не являются нулевыми завершенными массивами символов!)

Если вы добавляете некоторые операторы печати для печати длины, вы обнаружите, что oppositeWord два символа меньше word.

System.out.println(oppositeWord.length()); // prints 11 
System.out.println(word.length());   // prints 13 

Для того чтобы действительно сделать две строки равны, одни и те же символы заменяются в word также должны быть вставлены в oppositeWord в одних и тех же показателей или вообще убрать из обоих. т.е.

for(int i=length-1;i>=0;i--) { 
    if(Character.isLetter(word.charAt(i))) { 
     oppositeWord +=word.charAt(i); 
    } else { 
     word = word.replace(word.charAt(i),'\0'); 
     oppositeWord += word.charAt(i); // << This line! 
    } 
} 

Теперь обе строки будут содержать ту же информацию, и oppositeWord.equals(word) будет держать.

Также FYI, StringBuilder и StringBuffer оба метода имеют reverse(), которые могут быть использованы для упрощения этого процесса.

0

Это правда, как упомянуто bluemoon93, что две строки на самом деле не равны. Исходная строка - мадам и мадам. Это означает, что он состоит из пробелов, которые делают две строки разными. Я бы предположил, что вы удаляете пунктуацию, пробелы из исходной строки, используя регулярное выражение. Это приведет к удалению лишних пробелов или знаков препинания.

public boolean isPalindrome(String word){ 
    int length; 
    String oppositeWord =""; 

    word = word.toLowerCase(); 
    length = word.length(); 

    String newword = word.replaceAll("[\\s\\p{Punct}]", ""); 

    for(int i=length-1;i>=0;i--){ 
     if(Character.isLetter(word.charAt(i))){ 
      oppositeWord +=word.charAt(i); 
     } 

    } 

    System.out.println(oppositeWord); 
    System.out.println(newword); 

    return oppositeWord.equals(newword); 

} 

Возвращаемый результат теперь будет возвращать верно, так как обе строки равны, поскольку они совпадают по уважительной характер и не содержат пробелы или знаки препинания.

Смежные вопросы