子串索引范围

Posted

技术标签:

【中文标题】子串索引范围【英文标题】:substring index range 【发布时间】:2011-06-01 23:39:57 【问题描述】:

代码:

public class Test 
    public static void main(String[] args) 
        String str = "University";
        System.out.println(str.substring(4, 7));
       

输出: ers

我不太明白 substring 方法是如何工作的。索引是否从 0 开始?如果我从 0 开始,e 在索引 4 处,但 char i 在 7 处,所以输出将是 ersi

【问题讨论】:

另外,如果将开始索引设置为 str.length(),它不会抛出 IndexOutofBounds 异常。它只会返回一个空字符串。 【参考方案1】:

0: 上

1:n

2: 我

3: v

4: e

5: r

6: 秒

7: 我

8: t

9: 是的

起始索引包含在内

结束索引是排他的

Javadoc link

【讨论】:

谢谢,这正是我发现的信息; beginIndex - 起始索引,包括在内。 endIndex - 结束索引,不包含。 只要把它想象成一个以 0 为底的 char 数组,就像所有其他数组一样,第二个参数是 stop 位置而不是结束位置。【参考方案2】:

两者都是从 0 开始的,但开头是包含的,结尾是排除的。这确保了结果字符串的长度为start - end

为了让substring 操作更轻松,假设字符在 索引之间。

0 1 2 3 4 5 6 7 8 9 10  <- available indexes for substring 
 u n i v E R S i t y
        ↑     ↑
      start  end --> range of "E R S"

引用docs:

子字符串从指定的位置开始 beginIndex 并扩展到 索引 endIndex - 1 处的字符。因此 子串的长度是 endIndex-beginIndex.

【讨论】:

【参考方案3】:

见the javadoc。它是第一个参数的包含索引,第二个参数是独占索引。

【讨论】:

【参考方案4】:

像你一样,我发现它不是自然而然的。我通常仍然需要提醒自己

返回字符串的长度

lastIndex - firstIndex

您可以使用字符串的长度作为 lastIndex,即使那里没有字符并且尝试引用它会引发异常

所以

"University".substring(6, 10)

即使位置 10 没有字符,也返回 4 个字符的字符串“sity"”。

【讨论】:

【参考方案5】:
public String substring(int beginIndex, int endIndex)

beginIndex——开始索引,含。

endIndex——结束索引,独占。

例子:

public class Test 

    public static void main(String args[]) 
        String Str = new String("Hello World");

        System.out.println(Str.substring(3, 8));
    
 

输出:“lo Wo”

从 3 到 7 的索引。

还有另一种substring()方法:

public String substring(int beginIndex)

beginIndex——开始索引,包括。 返回从beginIndex 到主字符串末尾的子字符串。

例子:

public class Test 

    public static void main(String args[]) 
        String Str = new String("Hello World");

        System.out.println(Str.substring(3));
    

输出:“lo World”

从 3 到最后一个索引。

【讨论】:

【参考方案6】:

是的,索引从零 (0) 开始。这两个参数是 startIndex 和 endIndex,根据文档:

子字符串从指定的 beginIndex 开始并延伸到索引 endIndex - 1 处的字符。

更多信息请参见here。

【讨论】:

【参考方案7】:

子字符串从给定的第一个数字的位置开始并包含字符,然后转到,但不包括给定的最后一个数字的字符。

【讨论】:

【参考方案8】:

对于 substring(startIndex, endIndex),startIndex 是包含的,endIndex 是排除的。 startIndex 和 endIndex 非常混乱。 我会理解 substring(startIndex, length) 记住这一点。

【讨论】:

【参考方案9】:
public class SubstringExample

    public static void main(String[] args) 
    
        String str="OOPs is a programming paradigm...";

        System.out.println(" Length is: " + str.length());

        System.out.println(" Substring is: " + str.substring(10, 30));
    

输出:

length is: 31

Substring is: programming paradigm

【讨论】:

以上是关于子串索引范围的主要内容,如果未能解决你的问题,请参考以下文章

找到最长的回文子串

LeetCode刷题8——最长回文子串

代码点索引的Java子串(将代理代码单元对作为单个代码点处理)

算法-最大不重复子串Go+python

不同子串

2021-12-18:找到字符串中所有字母异位词。 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成