我有一个显示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);
我得错误索引因为我想获得List之外的索引。我如何能够将List元素从30返回到35?我想如果我想从30到40得到索引,但如果只有35个索引只得到5。
答案 0 :(得分:86)
使用subList(30, 38);
将失败,因为列表中没有最大索引38,因此无法使用。
在询问子列表之前,只有方法可以使用list size()方法明确确定最大索引。
例如,检查尺寸,返回35,因此请调用sublist(30, size());
OR
从pb2q评论中复制
dataList = dataList.subList(30, 38 > dataList.size() ? dataList.size() : 38);
答案 1 :(得分:40)
要获取最后一个元素,只需使用列表的大小作为第二个参数。例如,如果您有35个文件,并且您想要最后五个文件,那么您可以这样做:
dataList.subList(30, 35);
保证安全的方法是:
dataList.subList(Math.max(0, first), Math.min(dataList.size(), last) );
答案 2 :(得分:38)
我已经实施并测试了这个;它应涵盖大多数基地:
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);
}
答案 3 :(得分:2)
您可以在Java 8中使用流。要始终最多获得10个条目,您可以这样做:
dataList.stream().skip(5).limit(10).collect(Collectors.toList());
dataList.stream().skip(30).limit(10).collect(Collectors.toList());