两个字符串的比较

3

我有以下代码:

    int t = s.length()-1;
    int g = 0;

    for (int i=0; i < s.length(); i++){

        if (s.charAt(i) != h.charAt(t--));
            g++;

    }

    if (g==0)
        return true;

    else 
        return false;

基本上这段代码的作用是测试字符串 h 的逆是否等于字符串 s,或者反过来。但不知何故,代码总是返回“false”,虽然显而易见的答案应该是“true”。
请问有人能告诉我代码有什么问题吗?
谢谢!

你期望得到什么?和你实际得到了什么? - Javed Akram
@Javed 我期望得到 true,但是我一直得到 false。例如:ATG VS GTA - 这应该是 true;ATG VS TAG - 这应该是 false。 - ISJ
4个回答

8
我认为多了一个分号是罪魁祸首。
而不是:

if (s.charAt(i) != h.charAt(t--));

使用

if (s.charAt(i) != h.charAt(t--))

在编写代码时,应该始终采取“安全”的方式。也就是说,在 if-else 语句(以及几乎所有可以使用它们的地方)后面使用大括号,这样就不会出现此类错误。正确的编写方式如下:

if (s.charAt(i) != h.charAt(t--)) {
   g++;
}

顺便提一下,如果您没有先检查sh的长度是否相同,那么您的代码将会崩溃。


1
@Nikita: true。在Java语言规范中强制使用大括号会让一些人尖叫不已,但全球Java代码中的错误总数也将减少。 - darioo
非常感谢!它解决了问题。这两个字符串将始终具有相同的长度。字符串h是在其中的字符被更改之前的字符串s。因此它将始终保持不变。非常感谢,这是一堂宝贵的课! - ISJ
1
不幸的是,没有任何东西可以阻止你编写 if (condition); { do-it-always; } - Piotr Findeisen
@Piotr:无论存在什么规则,总有人会找到打破它们的方法。 - darioo

3

if (s.charAt(i) != h.charAt(t--)); 中多余的 ; 可能会导致问题。

应该这样使用:

if (s.charAt(i) != h.charAt(t--))
{
  g++;
  break; // if not match, not need to continue with loop
}

嗨,我认为你最后的if语句不会起作用。如果所有字符都不同,除了一个或两个呢?那么它就不起作用了,对吧? - ISJ
好的,我看到你已经改变了它。 - ISJ

1

除非这是一项学习练习,否则我建议您避免自己编写循环并使用一些库代码。您可以这样做:

String s = "abcd";
String h = "dcba";

System.out.println( h.equals( new StringBuffer(s).reverse().toString() ) );

或者StringUtils#reverse


这些循环在内部以类似于你之前进行的方式遍历字符串。如果你想看一下代码,可以查看AbstractStringBuilder

不是同一个字符串,但它们的长度相等。 - ISJ
好的,我明白了,谢谢。你能解释一下这段代码是做什么的吗?我知道可以用StringBuffer来实现,但我宁愿使用自己的方法——我还处于学习Java的早期阶段,不想太快地使用太多函数。 - ISJ
这是一个学习练习,但我确信在编程中使用预编码的东西会更好。谢谢提示!我一定会查看的。 - ISJ

0

如果循环中没有相同的字符,使用break;来跳出循环

bool g = true;
for(.....)
{
   if (s.charAt(i) != h.charAt(t--))
   {
      g = false;
      break;
   }
}
return g;

它可以提高你的性能。


更进一步的优化方法是使用 boolean g 可能会更快。 - darioo
你可以通过比较字符串长度进一步优化它。 - Adisesha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接