我有一个显示Glassfish日志文件列表的JSF页面.我使用延迟加载进行分页.我将日志文件名列表保存到Java中List.
private List<directoryListObj> dataList = new ArrayList<>();
dataList = dataList.subList(firstRow, lastRow);
Run Code Online (Sandbox Code Playgroud)
这就是问题所在.例如,我有35个文件到目录中.当我这样做
dataList = dataList.subList(5, 15);
Run Code Online (Sandbox Code Playgroud)
它工作正常.但是当我这样做时:
dataList = dataList.subList(30, 38);
Run Code Online (Sandbox Code Playgroud)
我得错误索引索引,因为我想得到List之外的索引.我如何能够将List元素从30返回到35?我想如果我想从30到40得到索引,但如果只有35个索引只得到5.
kos*_*osa 87
使用subList(30, 38);将失败,因为列表中没有最大索引38,因此不可能.
只有在询问子列表之前,您可以使用list size()方法显式确定最大索引.
例如,检查大小,返回35,所以调用 sublist(30, size());
要么
从pb2q评论回复
dataList = dataList.subList(30, 38 > dataList.size() ? dataList.size() : 38);
Run Code Online (Sandbox Code Playgroud)
Joe*_*e K 43
要获取最后一个元素,只需使用列表的大小作为第二个参数.例如,如果您有35个文件,并且您想要最后五个文件,那么您可以:
dataList.subList(30, 35);
Run Code Online (Sandbox Code Playgroud)
保证安全的方法是:
dataList.subList(Math.max(0, first), Math.min(dataList.size(), last) );
Run Code Online (Sandbox Code Playgroud)
Har*_*_OK 40
我已经实施并测试了这个; 它应涵盖大多数基础:
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);
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*erl 10
您可以在 Java 8 中使用流。要始终获得最多 10 个条目,您可以执行以下操作:
dataList.stream().skip(5).limit(10).collect(Collectors.toList());
dataList.stream().skip(30).limit(10).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
130983 次 |
| 最近记录: |