82

我有一个显示 Glassfish 日志文件列表的 JSF 页面。我使用延迟加载进行分页。我将日志文件名列表保存到 JavaList中。

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,我想要。

4

6 回答 6

99

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

唯一的方法可能是在请求子列表之前,您使用列表 size() 方法显式确定最大索引。

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

或者

复制自 pb2q 评论

dataList = dataList.subList(30, 38 > dataList.size() ? dataList.size() : 38);
于 2012-08-23T20:49:03.713 回答
51

我已经实现并测试了这个;它应该涵盖大多数基础:

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);
}
于 2015-06-23T12:57:32.380 回答
43

要获取最后一个元素,只需使用列表的大小作为第二个参数。因此,例如,如果您有 35 个文件,并且想要最后五个文件,您可以:

dataList.subList(30, 35);

保证安全的方法是:

dataList.subList(Math.max(0, first), Math.min(dataList.size(), last) );
于 2012-08-23T20:52:33.353 回答
11

您可以在 Java 8 中使用流。要始终最多获得 10 个条目,您可以执行以下操作:

dataList.stream().skip(5).limit(10).collect(Collectors.toList());
dataList.stream().skip(30).limit(10).collect(Collectors.toList());
于 2019-04-02T09:32:58.847 回答
0

虽然可能为时已晚,但我建议在 Java 8 中使用流以避免手动处理越界异常。

这段代码

dataList = dataList.stream().skip(30).limit(8).collect(Collectors.toList());

工作方式相同

dataList = dataList.subList(30, 38);

如果出现索引错误,dataList 将是空列表,而不是抛出任何异常。

于 2021-09-28T10:41:27.097 回答
0

对于 kotlin,您可以使用: myList.subList(min, max.coerceAtMost(myList.size)

或者就上述问题而言:myList.subList(30, 38.coerceAtMost(myList.size)

于 2022-02-09T19:45:21.187 回答