java - 索引范围的上限是否总是假定为排他性的?

标签 java collections indexing range

因此在 Java 中,无论何时给出索引范围,上限几乎总是排他的。

来自java.lang.String:

substring(int beginIndex, int endIndex)

Returns a new string that is a substring of this string. The substring begins at the specified beginIndex and extends to the character at index endIndex - 1

来自java.util.Arrays:

copyOfRange(T[] original, int from, int to)

from - the initial index of the range to be copied, inclusive
to - the final index of the range to be copied, exclusive.

来自 java.util.BitSet:

set(int fromIndex, int toIndex)

fromIndex - index of the first bit to be set.
toIndex - index after the last bit to be set.

如您所见,Java 确实试图使上限互斥成为一致的约定。

我的问题是:

  • 这是官方的权威推荐吗?
  • 是否存在我们应该警惕的明显违规行为?
  • 这个系统有名字吗? (ala“基于 0”与“基于 1”)

澄清:我完全理解在基于 0 的系统中 N 对象的集合索引为 0..N-1。我的问题是,如果给定范围 (2,4),它可以是 3 项或 2 项,具体取决于系统。您如何称呼这些系统?

再一次,问题不是“第一个索引 0 最后一个索引 N-1”与“第一个索引 1 最后一个索引 ” N”系统;这就是所谓的基于 0 与基于 1 的系统。

问题是“(2,4) 中有 3 个元素”与“(2,4) 中有 2 个元素”系统。你怎么称呼这些,一个比另一个得到官方认可?

最佳答案

一般来说,是的。如果您使用的语言具有类似 C 的语法(C、C++、Java),那么数组是零索引的,并且大多数随机访问数据结构( vector 、数组列表等)都将是零索引的以及。

从零开始索引意味着数据结构的大小总是比数据结构中最后一个有效索引大 1。当然,人们通常想知道事物的大小,因此谈论大小比谈论最后一个有效索引更方便。 人们习惯于以排他的方式谈论结束索引,因为 a[]n 元素长的数组在 中有它的最后一个有效元素a[n-1].

使用独占索引作为结束索引还有另一个优点,即可以通过从独占结束索引中减去包含开始索引来计算子列表的大小。如果我调用 myList.sublist(3, 7),我会得到一个包含 7 - 3 = 4 元素的子列表。如果 sublist() 方法对列表的两端都使用了包含索引,那么我需要额外添加一个 1 来计算子列表的大小。

当起始索引是一个变量时,这特别方便:获取 myList 的子列表,从 i 开始,长度为 5 个元素,就是 myList.sublist (i, i + 5).

综上所述,您应该始终阅读 API 文档,而不是假设给定的开始索引或结束索引将包含或排除。同样,您应该记录自己的代码以指示任何边界是包容性的还是排他性的。

关于java - 索引范围的上限是否总是假定为排他性的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2440282/

相关文章:

java - 如何创建 20 个固定长度的随机字节

java - 无法运行或 jai_imageio 或 ImageIO.getImageReadersByFormatName 无法获取对象

c# - 从 IEnumerable<KeyValuePair<>> 重新创建字典

java - 在 Java 中存储不同类型对象的有序列表的最佳方法?

sql - 提高性能SP

java - 在Android中将日期格式转换为另一种日期?

java - onBindViewHolder(RecyclerView.ViewHolderholder, intposition) - 无法访问holder的 'fun' - Kotlin到Java

c# - 检查 list<MyObject> 是否已经在集合中

mysql - 索引列和非索引列研究

mysql - 我应该如何优化这个查询?