为什么ArrayList.subList(0,n)返回大小为n的List?

时间:2016-05-16 14:40:57

标签: java list arraylist sublist

我原本以为这个问题以前会得到解答,但似乎无法找到任何相关内容。

我的问题是标题所说,为什么从索引到索引创建子列表,而不是返回我期望的索引总数?

更详细的例子:

List slice = points.sublist(20, 48);
Log.i(TAG, slice.size());

我希望上面的示例中的日志返回29,但实际上它返回28。

为什么会发生这种情况?对此有何正确解决方案?要向第二个索引添加+1,还是为第一个索引添加-1?

6 个答案:

答案 0 :(得分:1)

显然写在documentation子列表中:

  

public List subList(int fromIndex,                 int toIndex)

     

返回指定列表中此列表部分的视图   fromIndex,inclusive,toIndex,exclusive。

要回答您的问题,据我了解,您可能希望将+1添加到第二个参数,因为它未包含在子列表中。

答案 1 :(得分:1)

  

我希望日志在上面的例子中返回29

根据Doc

,并非如此

<强>子列表(INT的fromIndex,                INT toIndex)  

  

返回指定
之间的此列表部分的视图   fromIndex,inclusive,toIndex,exclusive。 (如果
  fromIndex和toIndex相等,返回列表   是空的。)返回的列表由此列表支持,所以   返回列表中的非结构性更改将反映在此中   列表,反之亦然。返回的列表支持所有可选项   此列表支持的列表操作

答案 2 :(得分:1)

文档:

  

subList(int fromIndex,int toIndex)   返回指定fromIndex,包含和toIndex,独占之间此列表部分的视图。

您要求的一般用例是:

points.sublist(20, points.size());

答案 3 :(得分:0)

第一个索引是包容性的,另一个是独占的。 a.subList(0,n)返回包含元素0,1,2,...,n-1

的列表

documentation

中所述

答案 4 :(得分:0)

来自subList的文档:

/**
 * Returns a {@code List} of the specified portion of this {@code List} from the given start
 * index to the end index minus one. The returned {@code List} is backed by this
 * {@code List} so changes to it are reflected by the other.
 *
 * @param start
 *            the index at which to start the sublist.
 * @param end
 *            the index one past the end of the sublist.
 * @return a list of a portion of this {@code List}.
 * @throws IndexOutOfBoundsException
 *                if {@code start < 0, start > end} or {@code end >
 *                size()}
 */
public List<E> subList(int start, int end);

如您所见,end param是“超过子列表之一的索引”。 因此,当您说“停在48”时,它实际上会复制项目47然后停止。

答案 5 :(得分:0)

考虑到javadoc在这一点上非常清楚,提取的子列表包括fromIndex并且不包括List.subList中的toIndex(fromIndex,toIndex)

因此subList(0,1)将只返回一个元素的List:第一个元素。

Sublist javadoc