为什么这段代码没有产生预期的结果呢?

时间:2016-04-04 08:29:07

标签: java for-loop concatenation

以下java问题来自http://codingbat.com/prob/p132118

给定两个字符串,将它们附加在一起(称为“连接”)并返回结果。但是,如果连接创建了一个双字符,则省略其中一个字符,因此“abc”和“cat”会产生“abcat”。即:

conCat("abc", "cat") → "abcat"
conCat("dog", "cat") → "dogcat"
conCat("abc", "") → "abc"

这是我制定的解决方案:

public String conCat(String a, String b) {

String result = a + b; 
String r = "";
String f = "";

for(int i= 0; i < result.length(); i++)
 {  
   f   = Character.toString(result.charAt(i));      
   if(!( f.equals(result.charAt(i))) )
   r += f;             
 }

 return r;
 }

我的问题是 - 导致我的代码将“ab”+“bc”连接到“abbc”而不是“abc”的逻辑缺陷在哪里?

1 个答案:

答案 0 :(得分:3)

您得到a + b的结果,因为您要将字符串f与字符result.charAt(i)进行比较。它们永远不相同,因为它们的类型不同,所以r += f;无条件执行。

即使您已经纠正了这个问题,由于您已经连接了字符串,因此您的方法无效:您无法区分连接字符串,例如: conCat("ab", "bc") vs conCat("abbc", "")。在实际连接字符串之前,你需要在之前做一些事情。

如果满足以下所有条件,您需要删除一个字符:

  1. a非空
  2. b非空
  3. a的最后一个字符等于b的第一个字符。
  4. 在这种情况下,只需在连接之前切掉b的第一个字符。否则,只需按字母顺序连接字符串。

    public String conCat(String a, String b) {
     if (!a.isEmpty() && !b.isEmpty() && a.charAt(a.length() - 1) == b.charAt(0)) {
        return a + b.substring(1);
      } else {
        return a + b;
      }
    }