【问题标题】:Comparison of two strings两个字符串的比较
【发布时间】:2011-03-05 08:11:51
【问题描述】:

我有以下代码:

    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,反之亦然。出于某种原因,总是返回“假”——尽管显而易见的答案是正确的。

谁能告诉我我的代码有什么问题?

谢谢!

【问题讨论】:

  • 你期待什么?你得到了什么?
  • @Javed 我希望得到一个真实的结果,但我一直得到一个错误的结果。例如: ATG VS GTA - 这需要是真的; ATG VS TAG - 这必须是假的。

标签: java string reverse


【解决方案1】:

我想说一个额外的; 是罪魁祸首。

代替

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 的长度是否相同,您的代码将会崩溃。

【讨论】:

  • @尼基塔:是的。 Java语言规范中的强制大括号会让一些人愤怒地尖叫,但世界上Java代码中的错误总数也会减少。
  • 非常感谢!它解决了这个问题。两个字符串的长度总是相同的。字符串 h 是字符串 s 之前的字符已更改。所以它总是一样的。非常感谢,这是一个宝贵的教训!
  • 不幸的是,没有什么能阻止你写if (condition); { do-it-always; }
  • @Piotr:无论存在什么规则,总会有人想办法打破它们。
【解决方案2】:

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 语句不会起作用。如果除了一两个字符之外所有字符都不同怎么办?那就不行了吧?
  • 好的,我看到你已经改了。
【解决方案3】:

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

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

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

StringUtils#reverse


在幕后,这些循环以与您所做的几乎相同的方式遍历字符串。代码在AbstractStringBuilder,如果你想看看。

【讨论】:

  • 不,它是两个不同的字符串,但它们的长度相等。
  • 好的,我明白了,谢谢。你能解释一下代码的作用吗?我知道有一种使用 StringBuffer 的方法,但我宁愿使用我的方法 - 我正处于学习 java 的早期阶段,我不想太快使用太多函数。
  • 这是一个学习练习。但我确信最好在程序中使用预编码的东西。谢谢你的提示!我一定会去看看的。
【解决方案4】:

如果没有相同的字符,请使用 break; 退出循环

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

它会提高你的表现

【讨论】:

  • 进一步优化路线,使用boolean g 可能会更快。
  • 可以通过比较字符串长度进一步优化
猜你喜欢
  • 2020-09-05
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多