lastIndexOf(int ch)
将从末尾开始并向后搜索,返回最后一次出现的绝对索引。然后你可以从字符串的长度中减去那个数字并否定它,如果那是你真正想要的。
lastIndexOf(int ch, int fromIndex)
如果要从特定索引向后搜索,也可以使用。
要回答有关传递负数时会发生什么的问题,您可以深入研究 String 类的源代码。事实证明,indexOf
最终调用的实现将负值重置fromIndex
为零:
static int indexOf(char[] source, int sourceOffset, int sourceCount,
char[] target, int targetOffset, int targetCount,
int fromIndex) {
if (fromIndex >= sourceCount) {
return (targetCount == 0 ? sourceCount : -1);
}
if (fromIndex < 0) {
fromIndex = 0;
}
...
回到你的第二个例子:
"abcd".indexOf("d",-0)
...实现一个接受负索引并返回适当负索引(如果有的话)的通用 indexOf 更复杂,因为 Java 不区分int
0
和int
-0
(两者都将表示为 0),并且因为 String.indexOf 通常返回-1 如果未找到搜索字符串。但是,您可以接近您想要的。请注意,有一些注意事项:
String.indexOf
-1
如果未找到搜索字符串,则通常返回。但是因为-1
在我们的新实现中是一个有效的索引,我们需要定义一个新的合约。 Integer.MIN_VALUE
如果未找到搜索字符串,则现在返回。
- 因为我们无法测试
int
-0
,所以我们不能将最后一个字符的索引称为-0
。出于这个原因,我们使用-1
引用最后一个字符的索引,并从那里继续倒数。
-1
为了与第 2 项保持一致,负返回值也从最后一个字符的索引开始倒计时。
代码可以简化,但我故意让它变得冗长,这样您就可以在调试器中轻松地单步执行它。
package com.example.string;
public class StringExample {
public static int indexOf(String str, String search, int fromIndex) {
if (fromIndex < 0) {
fromIndex = str.length() + fromIndex; // convert the negative index to a positive index, treating the negative index -1 as the index of the last character
int index = str.lastIndexOf(search, fromIndex);
if (index == -1) {
index = Integer.MIN_VALUE; // String.indexOf normally returns -1 if the character is not found, but we need to define a new contract since -1 is a valid index for our new implementation
}
else {
index = -(str.length() - index); // convert the result to a negative index--again, -1 is the index of the last character
}
return index;
}
else {
return str.indexOf(str, fromIndex);
}
}
public static void main(String[] args) {
System.out.println(indexOf("abcd", "d", -1)); // returns -1
System.out.println(indexOf("adbcd", "d", -2)); // returns -4
}
}