【问题标题】:Who does substring(startIndex,endIndex) return string from startIndex start till endIndex-1?substring(startIndex,endIndex) 返回从 startIndex 开始到 endIndex-1 的字符串?
【发布时间】:2013-05-19 00:54:42
【问题描述】:

我有以下代码

public static void main(String args[]) throws Exception
{
    String mySite = "StackOverflow";
    System.out.println(mySite.substring(0, 4));
}

这个打印的是Stac 根据我的理解,索引从 0 开始。

S<-0
t<-1
a<-2
c<-3
k<-4

当我指定我需要从索引 0 到索引 4 的字符串时,我希望返回 Stack,但它会返回 Stac

当我查看 substring(int beginIndex, int endIndex) 源代码时,它显示以下内容。

 * @param      beginIndex   the beginning index, inclusive.
 * @param      endIndex     the ending index, exclusive.

有人能解释一下在这种情况下包容性和排他性是什么意思吗?为什么它没有变得更直观?有谁知道这种行为的任何具体原因?

【问题讨论】:

  • substring() 根本不打印任何内容。请把你的标题改成有意义的东西。

标签: java string


【解决方案1】:
  • Inclusive 表示将包含该索引处的项目。
  • 独占表示该索引处的项目将包含在内。

真正的原因只能猜测,除非你能在源代码中找到解释它的注释(可能),或者找到并询问原作者(极不可能)。

可以推断出原因是因为Java(以及几乎所有其他语言)中的Strings 和Lists 等都是0索引的(从你的问题来看,你似乎明白了,所以我'将跳过解释),但这些长度的值总是比最终索引的值大一。还有许多其他示例和实例排除某种“子字符串”/“子列表”/等的最终索引。功能,因为这样可以轻松获取字符串/列表/等的长度。并将其作为结束索引传递,然后始终假定它将被排除在子功能的底层实现中,这样用户就不必总是记住放置 -1 或类似的偏移量,如果长度是用作结束索引。

真的,在您意识到 0-index 与长度的交互之后,它可以说是(更)直观。

this duplicate question 的已接受答案中有一个很好的解释,将 C 带入了解释中。

【讨论】:

  • 毫无疑问更直观的是采用开始索引和长度而不是开始/结束索引的方法:)
  • @280Z28 可以说是这样,但我认为由于各种indexOf 风格的方法(可以从中计算长度)而不是只有一个索引,我认为一个更有可能以两个索引结束和一个长度,因此假设拥有更多的 start-to-end-index 方法比拥有 start-index-with-length 方法更有意义。此外,其中大部分基于 C 约定,因为 Java 松散地基于 C,所以无论这些约定是否适用于 Java,它们都存在。
【解决方案2】:

包含表示该索引处的字符将被包含
独占表示该索引处的字符将排除。

基本上,它将包括非常字符直到——但不包括——endIndex

【讨论】:

  • 这种不直观的行为有什么具体原因吗?
【解决方案3】:

Inclusive = 包含字符

独占=不包括字符

原因可能是历史惯例,但我不知道。

【讨论】:

    【解决方案4】:

    “直觉”在旁观者的眼中。

    当您开始编写一些代码时,您会发现该行为非常方便。构造子字符串时,您通常拥有其中的第一件事的索引,并且:

    1. 所需的长度,在这种情况下endIndex 就是startIndex+length,或者
    2. 在所需子字符串中不是的第一个字符的索引,例如分隔符,在这种情况下,它已经是endIndex 的正确值。

    第三种情况是当您拥有子字符串中最后一个所需字符的索引时,在这种情况下,endIndex 应该设置为该值加 1。但这只是三分之一的情况(到目前为止)。

    【讨论】:

      猜你喜欢
      • 2012-05-07
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 2015-02-03
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多