【问题标题】:Doesn't return expected concatenate String不返回预期的连接字符串
【发布时间】:2019-08-29 10:35:47
【问题描述】:

我改进了 CodingBat 中 startOz 任务的解决方案。我从前一个中找到了更好的解决方案,当我测试它时,我在一个测试用例中得到了一个意想不到的解决方案。

public String startOz(String str) {
   String result = (str.indexOf('o') == 0 ? "o" : "").concat(str.indexOf('z') == 1 ? "z" : "");
   return result;
  }
// test case:
String str = "zzzz";
System.out.println("test=" + startOz(str));

我不明白为什么我期望得到 test=z 时却得到空字符串作为结果

【问题讨论】:

  • 你在另一个方法中有一个方法。这只是一个错字吗?
  • 调试我要说的代码!
  • 请创建一个完整而具体的minimal reproducible example
  • str.indexOf('z') 不会返回1 如果str=="zzzz",它将是0
  • 您假设每个人都知道startOz 任务是什么,以及之前的解决方案是什么。请edit您的问题并添加链接和简短描述(以防链接及时消失)。 StackOverflow 上的问题不仅适合您,也适合所有即将到来的程序员。

标签: java string if-statement char jvm


【解决方案1】:

返回空字符串的原因是indexOf条件的结果是空字符串。

"zzzz"

这部分返回空字符串,因为没有“o”字符

(str.indexOf('o') == 0 ? "o" : "") //Equals to ""

然后这也返回空,因为“z”是索引 0。

(str.indexOf('z') == 1 ? "z" : "") //Equals to ""

indexOf 返回匹配索引号的第一个字符,因此“z”的索引为 0。 给你。

【讨论】:

  • +1 表示您的讽刺评论,您迟到了这个答案,因为@Michel 已经详细回答了它,但仍然支持 REP:p
  • @Ravi 迟到总比不到好。
【解决方案2】:

str.indexOf('z') == 1 返回 false,因为 indexOf返回此字符串中第一次出现指定字符的索引”。在您的情况下,str.indexOf('z') 为零,因为零是第一次出现。

a version of this method which takes an additional argument 定义了从哪个索引开始,因此您可以使用以下内容来检查 Z 是否是第二个字符:

str.indexOf('z', 1) == 1

也就是说,解决这个问题的更好方法可能是使用charAt

if (str.charAt(0) == 'o') //...
if (str.charAt(1) == 'z') //...

【讨论】:

  • 感谢您在我的情况下的清晰解释和解决方案!
【解决方案3】:

因为字符串索引从 0 开始

str.indexOf('z') == 1 is false

str.indexOf('z') == 0 is true

【讨论】:

    【解决方案4】:

    您的测试String 中没有'o' 字符,因此您将空String 与空String 连接起来,因为'z' 字符的第一个索引是0。indexOf 返回第一个匹配索引,所以它是 0,而不是 1。

    【讨论】:

      猜你喜欢
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多