由于您试图重新发明轮子以弄清楚轮子是如何工作的(这不是一件坏事!),使用 substring + 似乎有点作弊equals
,不是吗?为什么不直接实施检查,而不是将其传递给equals
?
基本思想是比较每个字符串的最后一个字符,然后是倒数第二个字符,然后是倒数第三个字符,等等。如果你得到一个不相等的比较,你可以返回 false。否则,您可以返回 true。换句话说,您将两个字符串逐个字符配对;而不是询问这些对是否都相等,而是询问它们中的任何一个是否不相等。
给定一个 int i
,您可以通过. 例如,最后一个数字是,倒数第二个是,等等。所以:stringLength - 1 - i
stringLength - 1
stringLength - 2
- 检查后缀是否长于
str
. 如果是的话,你可以return false
- 让我们
i
代表我们想看的右边有多少个字符
- 创建一个循环,从后缀的右侧开始查看所有i -ith 字符:
for(int i = 0; i < suffix.length(); ++i)
- 在每次迭代中,从两个字符串的右侧获取第i个字符,如上所述
- 如果它们不相等,
return false
. 如果它们相等,则继续下一次迭代
- 如果你已经用尽了所有的字符
suffix
(即,如果循环结束),则返回 true。
把它们放在一起:
public static boolean endsWithSuffix(String str, String suffix) {
int strLen = str.length();
int suffixLen = suffix.length();
if (suffixLen > strLen)
return false;
for (int i = 0; i < suffixLen; ++i) {
char strChar = str.charAt(strLen - 1 - i);
char suffixChar = suffix.charAt(suffixLen - 1 - i);
if (strChar != suffixChar)
return false
}
return true
}
的初始检查suffixLen > strLen
不仅仅是一种优化——它是正确性所必需的。否则,如果后缀比 str 长,那么循环将走得足够远,以至于您会要求str.charAt(-1)
甚至更低,这将引发异常!还有其他方法可以解决这个问题,但我会让你找到它们。:)