2016-05-16 94 views
-4

我原以为这个问题以前可能会被回答,但似乎无法找到任何有关它的信息。为什么ArrayList.subList(0,n)返回大小为n的列表?

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

更详细的例子:

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

我期望的日志在上面的例子返回29,但事实上它返回28

为什么会出现这种情况,什么是正确的解决这个问题?向第二个索引添加+1,或者向第一个索引添加-1?

回答

1

可以清楚地写在子列表中的documentation

公共列表子列表(INT的fromIndex, INT toIndex)

返回指定 的fromIndex之间的这种列表的该部分的视图,包含性,以及指数,排他性。

要回答你的问题,据我所知,你可能想要+1添加到第二个参数,因为它不包括在子列表中。

+0

它会出现我是愚蠢的然后。我查了很多次文档,错过了“独家”这个词,似乎......谢谢。 – nineteeneightyeight

+0

@nineteeneightyeight如果你已经检查了文档,我建议把这个问题作为你所做的研究。首先,在写出你的研究结果时,你更有可能在文档中看到这个记录。其次,如果它像你在发布你的问题之前进行研究一样脱落,那么它就不太可能被低估。 – Ironcache

0

第一个索引是包含性的,另一个是排他性的。 a.subList(0,n)返回包含元素0,1,2,一个列表...,N-1

documentation

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参数是“该指数过去一个子列表的一个”。 因此,当你说“停在48”时,它实际上复制了物品47,然后停下来。

1

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

不是真的返回29,根据Doc

子列表(INT  的fromIndex, INT   toIndex)

返回指定
fromIndex(包括)元素范围为排他性之间此列表的所述部分的视图。 (如果
fromIndex和toIndex相等,则返回列表 为空。)返回的列表由此列表支持,因此 返回列表中的非结构更改将反映在此 列表中,反之亦然。返回的列表支持所有由该列表所支持的可选 列表操作的

1

文档:

子列表(INT的fromIndex,INT toIndex) 返回指定之间的这种列表的该部分的视图fromIndex,包括,以及索引,独占

一般使用情况下你所要求的是:

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

考虑的Javadoc在这一点上,所提取的子列表中包括的fromIndex和排除List.subList的toIndex很清楚(的fromIndex ,toIndex)

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

Sublist javadoc

相关问题