将substring()的endIndex减1的原因

时间:2012-12-08 21:01:28

标签: java arrays string

  

可能重复:
  why from index is inclusive but end index is exclusive?

substring() method => String substring(int beginIndex, int endIndex)

说明

  

返回一个新字符串,该字符串是此字符串的子字符串。首先   integer参数指定第一个字符的索引。该   第二个整数参数是最后一个字符的索引 - 1。

看看以下代码:

String anotherPalindrome = "Niagara. O roar again!"; 
String roar = anotherPalindrome.substring(11, 15); 

输出:roar

现在,如果JVM没有将int endIndex减去一个,我们可以使用substring(11,14)代替,这样会不会更方便,更不容易出错(人性化的一面)?如果您没有仔细阅读说明,当您认为endIndex只是正常索引时,您可能只是半个小时(就像我做的那样)挠头。 Java语言创建者将其减去一个的原因是什么?

4 个答案:

答案 0 :(得分:7)

它有几个优点:

s.substring(0, s.length())

总是正确的。也:

s.substring(i, j)

结果字符串的大小始终为j - i。更具体地说,s.substring(0, j)将始终返回j个字符。最后,这意味着如果您想在索引n之后获取i个字符,您只需说:

s.substring(i, i + n)

提取字符串的后缀(最后n个字符)也更容易:

s.substring(s.length() - n, s.length())

例如提取文件扩展名:

s.substring(s.indexOf('.') + 1, s.length())

答案 1 :(得分:3)

把它想象为字母之间的间隙,而不是字母本身:

 N i a g a r a . _ O  _  r  o  a  r  _  a  g  a  i  n  !
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

显然,roar1115之间的子字符串。

答案 2 :(得分:1)

这是同样的问题:

“为什么Java中的数组从0开始而不是1”。

的确,由于数组从0开始,你通常会写:

for(int i = 0; i < ar.length; i++)

同样,如果你想要一个从开始到结尾的子字符串,你可以使用类似的东西:

for(int i = start; i < end; i++)
{
    //get ar[i]
}

答案 3 :(得分:0)

substring似乎经常与indexOf方法一起使用。在这些情况下,您可以直接使用找到的索引作为endIndex参数来将字符串切断为分隔符字符串。例如:

    String text = "filename.ext";

    int pos = text.indexOf(".ext");
    String name = text.substring(0, pos);
    assertEquals("filename", name);

在这些情况下,pos变量已包含点的索引,子字符串可以将字符串切断为点。