Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的字符串回文检查器不工作?_Java_String_Boolean_Stringbuilder_Palindrome - Fatal编程技术网

java中的字符串回文检查器不工作?

java中的字符串回文检查器不工作?,java,string,boolean,stringbuilder,palindrome,Java,String,Boolean,Stringbuilder,Palindrome,我正试图为这些指令编写一个程序: 给定一个字符串,确定它是否是回文,只考虑字母数字字符,忽略大小写。 注意:为了解决这个问题,我们将空String定义为有效回文。 出于某种原因,最后一行中的.reverse()不会将其反转。我尝试过通过添加print语句进行调试,我发现前面的字符串确实相反。这是怎么回事?请引导我 public static boolean isPalindrome(String s) { StringBuilder sb = new StringBuilder();

我正试图为这些指令编写一个程序:

给定一个字符串,确定它是否是回文,只考虑字母数字字符,忽略大小写。 注意:为了解决这个问题,我们将空
String
定义为有效回文。

出于某种原因,最后一行中的
.reverse()
不会将其反转。我尝试过通过添加print语句进行调试,我发现前面的字符串确实相反。这是怎么回事?请引导我

public static boolean isPalindrome(String s) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        if (Character.isLetter(s.charAt(i))) {
            sb.append(s.charAt(i));
        }
    }
    String x = sb.reverse().toString();
    System.out.println(x);
    if (sb.length() == 0) 
        return true;
    else 
        return sb.toString().equals(x);
}
public静态布尔值isAlindrome(字符串s){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
问题在于更改了
StringBuilder
本身。所以你是在对比反面,再次对比反面。而是将方法更改为:

String x = sb.toString();
return sb.reverse().toString().equals(x);
public static boolean pali(String s) {
    String copy = s.toLowerCase().replaceAll("[^a-z]", "");
    return new StringBuilder(copy).reverse().toString().equals(copy);       
}
这将在反转之前比较
StringBuilder
,与反转后的
StringBuilder
。请注意,
if(sb.length==0)
是不必要的,因为如果它是空的,
sb.reverse().toString().equals(x)
仍将返回true

此外,当问题陈述说无论大小写都应该匹配时,您的搜索是区分大小写的。更改附加到的位置:

if (Character.isLetter(s.charAt(i))) {               
     sb.append(Character.toLowerCase(s.charAt(i)));
}

您还可以利用
replaceAll
toLowerCase()
将方法缩短为:

String x = sb.toString();
return sb.reverse().toString().equals(x);
public static boolean pali(String s) {
    String copy = s.toLowerCase().replaceAll("[^a-z]", "");
    return new StringBuilder(copy).reverse().toString().equals(copy);       
}

因为在第一次调用
sb.reverse()
sb之后,它改变了状态