【问题标题】:Reason for subtracting substring()'s endIndex by 1 [duplicate]将 substring() 的 endIndex 减去 1 的原因 [重复]
【发布时间】:2012-12-08 21:01:28
【问题描述】:

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

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

说明:

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

看看下面的代码:

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

输出:roar

现在,如果 JVM 没有将 int endIndex 减一,我们可以直接使用 substring(11,14),这样不是更方便且更不容易出错(人为方面)吗?如果你没有仔细阅读描述,当你认为endIndex 只是正常的索引时,你可能只是挠了半个小时(就像我一样)。 Java 语言的创造者为什么要把它减一?

【问题讨论】:

  • 另外,substring(int beginIndex, int length) 会更有意义。你知道你要提取多少个字符!!!
  • “开始包容,结束排他”几十年来一直是类 C 语言的传统。

标签: java arrays string


【解决方案1】:

它有几个优点:

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

总是正确的。另外:

s.substring(i, j)

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

s.substring(i, i + n)

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

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

例如提取文件扩展名:

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

【讨论】:

    【解决方案2】:

    将其视为对字母之间的间隙进行编号,而不是字母本身:

     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 之间的子字符串。

    【讨论】:

      【解决方案3】:

      这是同一个问题:

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

      确实,由于数组从 0 开始,您通常会这样写:

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

      类似地,如果你想要一个从 start 开始到 end 结束的子字符串,你会使用类似的东西:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2013-05-19
          • 1970-01-01
          • 2012-03-08
          • 2013-04-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多