如何使用subList()

我有一个显示Glassfish日志文件列表的JSF页面。 我使用懒加载分页。 我将日志文件名列表保存到Java List

 private List<directoryListObj> dataList = new ArrayList<>(); dataList = dataList.subList(firstRow, lastRow); 

这是问题。 例如,我有35个文件到目录中。 当我这样做

 dataList = dataList.subList(5, 15); 

它工作正常。 但是当我这样做:

 dataList = dataList.subList(30, 38); 

我得到错误的索引错误,因为我想索引列表之外。 我怎么可以例如返回列表元素从30到35? 我想如果我想索引从30到40,但如果只有35个索引只得到5。

使用子subList(30, 38); 将失败,因为最大索引38不在列表中,所以它不可能。

只有在询问子列表之前,您可以使用list size()方法明确确定最大索引。

例如,检查大小,返回35,所以调用sublist(30, size());

要么

从pb2q评论复制

 dataList = dataList.subList(30, 38 > dataList.size() ? dataList.size() : 38); 

要获得最后一个元素,只需使用列表的大小作为第二个参数。 例如,如果你有35个文件,而你想要最后五个文件,你可以这样做:

 dataList.subList(30, 35); 

保证安全的方法是:

 dataList.subList(Math.max(0, first), Math.min(dataList.size(), last) ); 

我已经实施并testing了这一个; 它应该涵盖大部分基地:

 public static <T> List<T> safeSubList(List<T> list, int fromIndex, int toIndex) { int size = list.size(); if (fromIndex >= size || toIndex <= 0 || fromIndex >= toIndex) { return Collections.emptyList(); } fromIndex = Math.max(0, fromIndex); toIndex = Math.min(size, toIndex); return list.subList(fromIndex, toIndex); }