为什么我的Codingbat String-2 EndOther代码不起作用?

时间:2016-11-03 21:50:16

标签: java string

我不会说谎,这是我的AP计算机科学课的一些功课。但我和老师谈过,他也无法弄清楚。

所以我正在做Java CodingBat问题String-2 endOther here,我不知道为什么我的代码没有正常工作。

挑战的目标是确定一个字符串是否出现在另一个字符串的最末端。如果是,则返回true,否则返回false。

示例:如果字符串是" Hiabc"和" abc",它会返回true,但" Hiabcx"和" bc"将返回false,因为" bc"最后不是。 注意:案例无关紧要。

我的代码适用于它运行的所有示例,除了"其他测试"。我可能已经能够弄清楚如何解决它,除了我不知道"其他测试"它跑了。那么对此有何帮助?这是我的代码:

public boolean endOther(String a, String b) {
    a = a.toLowerCase();
    b = b.toLowerCase();
    if (a.contains(b) && a.indexOf(b) == a.length() - b.length()) {
        return true;
    } else if (b.contains(a) && b.indexOf(a) == b.length() - a.length()) {
        return true;
    } else {
        return false; 
    }
}

谢谢!

3 个答案:

答案 0 :(得分:0)

我的直觉是他们希望你使用substring。这样做的原因很简单:只要它位于该字符串的 final 位置,在任何一个字符串中出现模式的位置都无关紧要。< / p>

您也不应该(在实践中)操纵您传入的参数,因为这可能会在以后绊倒您。将final添加到您的参数列表将阻止您这样做,以防万一您不小心认为它做了您不做的事情。

最后,您根本不需要将两个字符串转换为小写字母;有一个名为equalsIgnoreCase的方法,对于这种情况,就好了

为了解决这个问题,我抽出了一种不同的方法来完成主要比较。 main方法中的逻辑仅确定哪个字符串在哪里(因为较长的字符串可能在右侧)。下面是我的解决方案,它通过所有测试。

public boolean endOther(final String a, final String b) {
    if (a.length() >= b.length()) {
        return endOtherHelper(a, b);
    } else {
        return endOtherHelper(b, a);
    }
}

private boolean endOtherHelper(final String longStr, final String shortStr) {
    return longStr.substring(longStr.length() - shortStr.length()).equalsIgnoreCase(shortStr);
}

答案 1 :(得分:0)

我知道已经发布了这个问题的答案,但就原始代码而言,我想我已经知道出了什么问题。 如果其中一个&#34;其他测试&#34;使用了诸如&#34; abc&#34;之类的字符串。并与一个多次出现&#34; abc&#34;例如&#34; Hiabcabc&#34;,那么你的代码即使在#34; abc&#34;在#Hiabcabc&#34;结束时。 发生这种情况的原因是indexOf()查找参数的第一个出现并返回它的索引。这将导致在包含多个较小字符串的多次出现的测试中出现错误否定。

使用substring()可能是解决此问题的最佳方法,因为它可以让您专门查看字符串的结尾,但是如果您想尽可能少地修改代码,则可以使用{{ 1}}作为lastIndexOf()的替代方案。这将导致您的代码通过所有测试。

以下是修改过的代码:

indexOf()

以下是public boolean endOther(String a, String b) { a = a.toLowerCase(); b = b.toLowerCase(); if (a.contains(b) && a.lastIndexOf(b) == a.length() - b.length()) { return true; } else if (b.contains(a) && b.lastIndexOf(a) == b.length() - a.length()) { return true; } else { return false; } } 上的Oracle文档页面,以防您想要进行更多阅读:http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#indexOf(java.lang.String)

答案 2 :(得分:0)

看看这段代码,也许你会理解错误:

public boolean endOther(String a, String b) {
  if(a.length() < b.length())
    return b.toLowerCase().substring(b.length()-a.length()).equals(a.toLowerCase());
  else
    return a.toLowerCase().substring(a.length()-b.length()).equals(b.toLowerCase());
}