2009-10-30 3 views
1

У меня возник вопрос относительно базовой программы, которую я писал, сказал, что слово, такое как гоночный автомобиль, является палиндром или нет.Проверка, является ли строка палиндром с String.equals()

Все мои методы, которые меняют строку, делят функцию пунктуации, но тот, который определяет, является ли это палиндром, нет.

/** 
* Determines if a series of letters makes a palinedrome 
* 
* @param str All punctuation and spaces have been removed 
*    before this method is called. 
* @return true if phrase is a palindrome, 
*   false otherwise. 
*/ 
public boolean isPalindrome(String str) 
{ 
    String d = reverseString (str); 
    return(str.equals (reverseString (str))); 

} 
+21

пахнет домашней работой ... – jldupont

+0

Где вы определяете reverseString? – EmFi

+3

И вопрос в том ...? – sinuhepop

ответ

5

Если string reverseString(String string), и все пробельные был удален, то проверка, если что-то палиндром должен быть

public boolean isPalindrome(String string) 
{ 
    return string.equals(reverseString(string)); 
} 

Конечно, это чувствительно к регистру, так что если ваше определение палиндром не заботится о корпусе, а затем использовать equalsIgnoreCase вместо.

Если это не сработает, попробуйте снова проверить методы удаления и reverseString.

+0

Я что-то пропустил с этим кодом? Он выглядит точно так же, как и в вопросе, за исключением лишней строки «String d = ...». Или это просто для полноты ваших других точек? – paxdiablo

+0

Там для полноты. Вы правы, что я мог бы выразить себя лучше. В том, что код, который он опубликовал ранее, должен быть правильным, и что он должен искать в другом месте, где проблема. –

+0

Хорошо, это имеет смысл. И я согласен, что вы, вероятно, правы, где ошибка. Учитывая объем использования String.equals(), он уже должен быть без ошибок :-) – paxdiablo

6

Хорошо, я не уверен, что цель d призван служить в вашей функции, так как он никогда не используется, но, если вы хотите, чтобы понять, почему ваша функция не работает, просто добавьте отладочный код:

public boolean isPalindrome (String str) { 
    System.out.println ("DEBUG: original string = '" + str + "'"); 
    System.out.println ("DEBUG: reverse string = '" + reverseString (str) + "'"); 
    if (str.equals (reverseString (str))) 
     System.out.println ("DEBUG: returning true"); 
    else 
     System.out.println ("DEBUG: returning false"); 
    return str.equals (reverseString (str)); 
} 

Я бы поставил деньги на то, что что-то не так с вашей функцией reverseString (но не много денег). Эти отладочные заявления должны дать вам достаточно, чтобы выяснить, где проблема.

0

Ваша проблема в методе обратной строки, который вы не указали. Если этот метод работает правильно, ваш метод isPalindrome должен работать. Все, что вам нужно сделать, это исправить ваш метод обратной строки.

Java не имеет встроенного метода обратной строки, и я настоятельно рекомендую вам написать свой собственный.

Java, однако, имеет обратный метод для StringBuffer и StringBuilder. StringBuilder предпочтительнее, чем StringBuffer.

Используйте метод Equals, чтобы сравнить обращенную строку исходной строки

+0

-1 за то, что он рассказал ему, как решить свою домашнюю работу и сделать это плохо. StringBuilder предпочтительнее, чем StringBuffer –

+0

Я не писал никакого кода. Я только что упомянул о возможных путях решения проблемы. Действительно ли имеет значение, если stringbuilder предпочтительнее, чем stringbuffer? Это просто проблема, и ему нужно экспериментировать. –

+0

+1. @JM прав, я думаю. Он не опубликовал код, который мы все недовольны домашней работой. Подсказки относительно очевиден, но по-прежнему требуют честной работы OP. И этот уровень домашней работы можно было бы простить за выбор менее эффективного способа (я каждый день программирую Java и все еще думаю, что мои знания всей библиотеки находятся в диапазоне до 25%). Это, безусловно, более эффективно, чем перенос * собственного * reverseString(). – paxdiablo

0

Код должен выглядеть так:

String d = reverseString (str); 
return(str.equals (d)); 

Вам не придется вызывать дважды reverseString()

PS: StringBuffer имеет метод, который меняет строку.

0

Я уверен, что вы уже отправили свою домашнюю работу, но я изучаю java и нуждаюсь в практике, поэтому вот мой код для вас. Он использует массив символов и отменяет это. Я предполагаю, что лучше всего было бы использовать StringBuilder, но намерения вашей домашней работы, вероятно, чтобы научиться делать это самостоятельно:

public class reverseString { 
    public static void main(String[] args) { 
     System.out.println("racecar is a palindrome: "+ isPalindrome("racecar")); 
    } 

    public static boolean isPalindrome(String str) 
    { 
     String d = reverseString (str); 
     return(str.equals (reverseString (str))); 
    } 

    private static char[] reverse(char[] input) { 
     int length = input.length; 
     char[] reversed = new char[length]; 
     for (int i=0;i<length;i++) { 
      reversed[length-i-1]=input[i]; 
     } 
     return reversed; 
    } 

    private static String reverseString(String input){ 
     String reversed = new String(reverse(input.toCharArray())); 
     return reversed; 
    } 
} 

Выход:

racecar is a palindrome: true 

Если у кого есть какие-либо комментарии о том, почему мой код засасывает, убирайся. Я был бы признателен за конструктивную критику.

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