我不会说谎,这是我的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;
}
}
谢谢!
答案 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());
}