Java 负索引Of (从末尾开始计数 [length()] )

2022-09-01 20:48:30

在Java中,有没有办法找到从末尾开始的char的indexOf,并且像其他语言一样将long()作为参考?

   new String("abcd").reverseIndexOf("d"(,[4 or -0]))
or new String("abcd").indexOf("d",-0) // Should return a (-)1

...而不是显而易见的

   new String("abcd").indexOf("d") - newString("abcd").length()     

谢谢!


答案 1

lastIndexOf(int ch) 将从末尾开始向后搜索,返回上次出现的绝对索引。然后,您可以从字符串的长度中减去该数字并否定它,如果这是您真正想要的。

如果要从特定索引向后搜索,也可以使用 lastIndexOf(int ch, int fromIndex)。

若要回答有关传递负数时会发生什么情况的问题,可以深入了解 String 类的源代码。事实证明,最终称为的实现将负值重置为零:indexOffromIndex

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 不区分 和(两者都表示为 0),并且因为 String.indexOf 通常在找不到搜索字符串时返回 -1。但是,您可以接近您想要的。请注意,有一些注意事项:int0int-0

  1. String.indexOf如果未找到搜索字符串,通常返回。但是,由于在我们的新实现中是有效的索引,因此我们需要定义一个新协定。 如果未找到搜索字符串,则现在返回。-1-1Integer.MIN_VALUE
  2. 因为我们不能测试 ,所以我们不能将最后一个字符的索引称为 。因此,我们用来引用最后一个字符的索引,并继续从那里向后计数。int-0-0-1
  3. 为了与项目 2 保持一致,负返回值也开始倒计时,从 作为最后一个字符的索引开始。-1

代码可以简化,但我特意使它变得冗长,以便您可以在调试器中轻松单步执行它。

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

答案 2

只需使用方法:String.lastIndexOf()

String s = "abcd";
int rindex = s.lastIndexof('d');
System.out.println(rindex); // print 0