我原本以为这个问题以前会得到解答,但似乎无法找到任何相关内容。
我的问题是标题所说,为什么从索引到索引创建子列表,而不是返回我期望的索引总数?
更详细的例子:
List slice = points.sublist(20, 48);
Log.i(TAG, slice.size());
我希望上面的示例中的日志返回29,但实际上它返回28。
为什么会发生这种情况?对此有何正确解决方案?要向第二个索引添加+1,还是为第一个索引添加-1?
答案 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
的列表 中所述答案 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:第一个元素。