2016-11-03 87 views
0

我不会撒谎,这是我的AP计算机科学课的作业。但是我和我的老师谈过了,他也弄不明白。为什么我的Codingbat String-2 EndOther的代码不工作?

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

挑战的目标是确定一个字符串是否出现在另一个字符串的最后。如果是,则返回true,否则返回false。例如:如果字符串是“Hiabc”和“abc”,它将返回true,但由于“bc”不是结尾,所以“Hiabcx”和“bc”将返回false。 注:案例无关紧要。

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

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; 
    } 
} 

谢谢!

+0

两件事。首先,如果您没有失败的测试用例,我不确定您认为我们可以如何帮助您。其次,为什么不在你的String上使用'endsWith'方法? –

+0

@JoeC:你可以在CodingBat上自己运行测试;这个测试在一个不知名的“其他”盒子中失败了,这个盒子可能会令人沮丧地发现。 – Makoto

+0

我正在考虑沿着“边缘案例”的路线;即如果您的输入为空或空白,会发生什么情况,但问题并未指定该行为。 – Makoto

回答

0

我知道了这个问题的答案已经发布,但至于你原来的代码去,我想我有什么地方出了错的想法。 如果其中一个“其他测试”使用了诸如“abc”之类的字符串,并且与具有多次出现“abc”的字符串比如“Hiabcabc”进行比较,那么即使“abc”是在“Hiabcabc”的末尾。 发生这种情况的原因是indexOf()查找第一个发生该参数并返回它的索引。这会导致包含超过一个较小字符串的测试中的错误否定。

使用substring()可能是解决这个问题的最佳解决方案,因为它可以让你在字符串的结尾特意去找,但是如果你想修改你的代码尽可能少,你可以使用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; 
    } 
} 

而这里的甲骨文文档页面上indexOf()如果你想要做一些更多阅读:http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#indexOf(java.lang.String)

+0

我意识到'indexOf()'返回第一个找到的索引,我只是忘记了他们可能已经将相同的字符串放在另一个字符串中两次。但是,我不知道'lastIndexOf()'存在,所以我尝试了它,它工作。 – RoboticPlayer

0

我的直觉是他们希望你使用substring。原因很简单:只要它位于该字符串的最终位置上,那么这个模式在哪个字符串中都会出现并不重要。

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

最后,您不需要将两个字符串都转换为小写字母;有一种方法叫做equalsIgnoreCase,对于这种情况,其工作原理就好了

为了解决这个问题,我抽出了一个不同的方法来完成主要的比较。主要方法中的逻辑只确定哪个字符串在哪里(因为较长的字符串可能在右边)。以下是我的解决方案,其中通过全部的测试。

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); 
} 
+0

我没有使用'equalsIgnoreCase'方法的原因是因为我实际上没有检查任何字符串相等。再次,这个解决方案确实有效(再次涉及到使用'String.endsWith'方法),但是你知道我的代码为什么没有吗?就我个人而言,我宁愿向我解释为什么我写的东西不起作用,以及如何解决问题,而不是给予替代解决方案。如果我找不到原因,最终可能会使用'endsWith'方法,但理想情况下我只想修复当前的代码。 – RoboticPlayer

+0

@RoboticPlayer:这可能就是这样。我发现你的代码除了像变异你的参数那样的特定的代码外没有任何问题,但是实际的测试可能来自于检查你对方法的使用或者你对'String'方法调用的次数。实际上,你的代码可能没问题,而CodingBat使用的测试有点奇怪。我不会在这里读到太多的内容,但是我所编写的解决方案无论如何都是一个简单的方法,只要您能够正确地切入它。 – Makoto

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()); 
} 
+0

欢迎来到Stack Overflow!尽管您可能已经解决了此用户的问题,但仅有代码的答案对于未来出现此问题的用户来说并不是很有帮助。请编辑您的答案,以解释为什么您的代码可以解决原始问题。 –