2012-12-08 47 views
5

减去子()的endIndex的可能重复:
why from index is inclusive but end index is exclusive?原因由1

substring()方法=>String substring(int beginIndex, int endIndex)

描述:

返回一个新的领域这是该字符串的子字符串。第一个 整数参数指定第一个字符的索引。该 第二个整数参数是最后一个字符的索引 - 1

看看下面的代码:

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

输出:现在roar

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

+1

另外,substring(int beginIndex,int length)会更有意义。你知道你会提取多少个字符! – Chetan

+2

数十年来,“开始包容,终结独家”在C语言中已经传统。 –

回答

7

它具有以下几个优点:

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

是总是正确的。另外:

s.substring(i, j) 

生成的字符串的大小始终为j - i。更具体地说,s.substring(0, j)将始终返回j个字符。最后,这意味着如果你想利用指数in字符,则干脆说:

​​

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

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

例如提取文件扩展名:

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

这是因为同样的问题:

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

事实上,自从阵列从0开始你平时写:

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

同样的,如果你想有一个子从开始开始,并在年底结束,你会使用类似:

for(int i = start; i < end; i++) 
{ 
    //get ar[i] 
} 
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之间的子串。

0

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

String text = "filename.ext"; 

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

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