2013-02-22 54 views
1

我想检查是否一个字符串,输入的字符串,该字符串是回文检查回文(JAVA)(新秀状态)

,如果它是显示一些积极 如果不.. (无效)

我目前得到的答案无效(无论输入什么内容) 我不太确定如果for循环或布尔语句有问题。

//ACTION FROM BUTTON PERFORMED HERE 
private void ButtonActionPerformed(ActionEvent evt) { 
    //creating variables 
    String myString = textField1.getText(); 
    int stringLength = myString.length(); 
    char arrayOne[] = new char[stringLength]; 
    char arrayTwo[] = new char[stringLength]; 
    boolean palindrome = false; 

    //for loop to setup ARRAY ONE 
    for(int i = 0; i < stringLength-1; i++){ 
     arrayOne[i] = myString.charAt(i); 
    } 

    //for loop to setup ARRAY TWO 
    for(int i = stringLength-1; stringLength-1 > i; i--){ 
     arrayTwo[i] = myString.charAt(i); 
    } 

    //for loop checking if array indexes are equivalent in value (char) 
    for(int i = 0; i < stringLength-1; i++){ 
     if(arrayOne[i] != arrayTwo[i]){ 
      palindrome = false; 
     } 
     else{ 
      palindrome = true; 
     } 
    } 

    //assigning text to the text boxes based on boolean palindrome 
    if(palindrome == true){ 
     textField2.setText("Valid"); 
    } 
    if(palindrome ==false){ 
     textField2.setText("Invalid"); 
    } 
} 

}

我想我评论它descently

+1

可以使用调试器或添加调试代码。 – 2013-02-22 06:17:09

+0

http://stackoverflow.com/questions/4138827/check-string-for-palindrome?rq=1 – 2013-02-22 06:29:22

回答

3

变化

for(int i = stringLength-1; stringLength-1 > i; i--) 

for(int i = 0; i < stringLength-1; i++) 

,改变

for(int i = stringLength-1; i-1 > 0; i--) 

for(int i = stringLength-1; i-1 >= 0; i--) 

编辑:

这是巨星调试!!

这里是一个工作代码:

//for loop to setup ARRAY ONE 
for(int i = 0; i < stringLength-1; i++){ 
    arrayOne[i] = myString.charAt(i); 
} 

这也许应该是固定的这样:

String myString = textField1.getText(); 
    int stringLength = myString.length(); 
    char arrayOne[] = new char[stringLength]; 
    char arrayTwo[] = new char[stringLength]; 
    boolean palindrome = true; 
    //for loop to setup ARRAY ONE 
    for(int i = 0; i <= stringLength-1; i++){ 
     arrayOne[i] = myString.charAt(i); 
    } 

    //for loop to setup ARRAY TWO 
    for(int i = stringLength-1, pos = 0; i >= 0; i--, pos++){ 
     arrayTwo[pos] = myString.charAt(i); 
    } 

    //for loop checking if array indexes are equivalent in value (char) 
    for(int i = 0; i <= stringLength-1; i++){ 
     if(arrayOne[i] != arrayTwo[i]){ 
      palindrome = false; 
      break; 
     } 
    } 

    //assigning text to the text boxes based on boolean palindrome 
    if(palindrome == true){ 
      textField2.setText("Valid"); 
    } 
    else{ 
     textField2.setText("Invalid"); 
    } 
+0

如果'stringLength'大于1,这将是无限循环,因为'stringLength'在循环内永远不会改变。 – 2013-02-22 06:19:41

+0

如果将“> i”更改为“> 0” – 2013-02-22 06:20:06

+0

@LeeHurlbert,则会出现错误“字符串索引超出范围” 正确。不是无限的,因为它会以异常结束:) – 2013-02-22 06:20:59

1

这个循环复制所有除了最后一个这可能不是你想要的字符

//for loop to setup ARRAY ONE 
for(int i = 0; i < stringLength; i++) 
{ 
    arrayOne [i] = myString.charAt (i); 
} 

本循环体:

//for loop to setup ARRAY TWO 
for (int i = stringLength-1; stringLength-1 > i; i--) 
{ 
    arrayTwo [i] = myString.charAt (i); 
} 

永远不会执行,因为初始值为istringLength - 1不满足循环条件:stringLength - 1 > i

你或许应该改变它是:

// For loop to setup ARRAY TWO 
for (int i = 0; i < stringLength; i++) 
{ 
    arrayTwo [i] = myString.charAt (stringLength - i - 1); 
} 

而且,这个循环之后:

// for loop checking if array indexes are equivalent in value (char) 
for (int i = 0; i < stringLength-1; i++) 
{ 
    if (arrayOne [i] != arrayTwo [i]) 
    { 
     palindrome = false; 
    } 
    else 
    { 
     palindrome = true; 
    } 
} 

变量palindrome将只包含最后比较的结果,因此,如果除了最后的所有字符不同但最后的字符相同,palindrome将是true这可能不是你想要的。也许你应该改变这样的代码:

palindrome = true; 
for (int i = 0; i < stringLength; i++) 
{ 
    if (arrayOne [i] != arrayTwo [i]) 
    { 
     palindrome = false; 
    } 
} 

请注意,我也改变stringLength - 1stringLength,否则你忽略了最后一个字符。

+0

我看 - 那么如果我要改变第二部分“stringLegnth-1>我”到“我> 0”它会满足条件或使它永远真实 – 2013-02-22 06:27:22

1
//for loop to setup ARRAY TWO 
for(int i = stringLength-1; stringLength-1 > i; i--){ 
    arrayTwo[i] = myString.charAt(i); 
} 

在第一次迭代之后,这会发生。

你需要改变它的东西,如:

//for loop to setup ARRAY TWO 
for(int i = stringLength-1; i > 0; i--){ 
    arrayTwo[i] = myString.charAt(i); 
} 
+0

非常感谢!工作完美,我意识到我的错误 – 2013-02-22 06:24:31

0

最简单的方法在Java

String str = "Able was I ere I saw Elba" 
boolean palindrome = str.equalsIgnoreCase(new StringBuilder(str).reverse().toString()); 

没错来测试回文,仅此而已。

+0

我感谢你这^ _ ^但是,{我知道怪异}我实际上试图写的方法“检查反向”感谢寿! – 2013-02-22 06:24:02

+0

也许也应该修剪()它 – gandolf 2013-02-22 06:24:49

+0

最简单,是的,最有效的,没有 – bowmore 2013-02-22 06:27:08

0
public static void main(String[] args) { 
    String s = "akaq"; 
    boolean b = false; 
    for (int i = 0, j = s.length() - 1; i < j; i++, j--) { 
     if (s.charAt(i) == s.charAt(j)) { 
      b = true; 
      continue; 
     } else { 
      b = false; 
      break; 
     } 
    } 
    if (b) 
     System.out.println("Palindrome"); 
    else 
     System.out.println("Not Palindrome"); 
} 

试试这样的而不是2-3的循环。

2

我同意你的错误其他的答案,但我认为一个更简洁的解决方案将是

boolean isPalindrome(String myString) {  
    int n = myString.length; 
    for(int i = 0; i < n/2; i++) 
     if (myString.charAt(i) != myString.charAt(n-i-1)) return false; 
    return true;  
} 

您的代码将现在是

private void ButtonActionPerformed(ActionEvent evt) { 
    String myString = textField1.getText();  
    textField2.setText(isPalindrome(myString) ? "Valid" : "Invalid"); 
} 
+0

+1最佳答案迄今 – 2013-02-22 06:27:15

+0

我绝对喜欢这个 - 但它没有阵列,我应该单独调用这个 – 2013-02-22 06:30:50

+0

你不'根本不需要数组。无论如何,当你可以逐一访问字符串的字符时,我建议你不要使用它们。 – 2013-02-22 06:33:18

0

更改第一从stringLength-循环1 to stringLength因为您使用的是<而不是< =

将第二个循环更改为

if(int i = stringLength-1; i>=0; i--) 

此外,默认设置回文为true,并除去

else{ 
    palindrome = true; 
} 

一部分,因为现在如果循环的第一个和最后一个字符是相同的,但不是中间,它会返回true。

编辑:另外,在第三for循环应该是stringLength而不是stringLength-1,因为你正在使用<,而不是< =

+0

你的意思是(int i = stringLength-1; i> = 0; i ++) – 2013-02-22 06:28:50

+0

不,因为那样我会永远增加,永远不会小于0。 – 2013-02-22 06:30:50

0

有没有需要的一切复制到阵列。字符串基本上是一个数组本身。您可以使用charAt()访问单个字符。

也不需要循环整个字符串的长度,因为等号是关联的。

所以,简单地使用:

public boolean isPalindrome(String s) { 
    for (int i = 0; i < s.length()/2; i++) {     // only until halfway 
     if (s.charAt(i) != s.charAt(s.length() - i - 1)) {  // accessing characters of String directly 
      return false; 
     } 
    } 
    return true; 
} 

最后一个备注:如果字符串的长度为奇数,你并不需要检查中间chracter。所以在上面的代码中,通过