如何使用subList()

时间:2012-08-23 20:46:47

标签: java

我有一个显示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。

4 个答案:

答案 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());