如何使用subList()

use*_*928 71 java

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

  • 如果列表少于30个项目,那也会失败. (5认同)
  • 我更喜欢`dataList = dataList.subList(30, Math.min(38, dataList.size()));` (4认同)

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)

  • 如果'first'大于列表大小,那也会失败. (3认同)
  • @Haroldo_OK:或者如果`last`是负面的! (3认同)

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)

  • 这应该是公认的答案,唯一一个为测试代码而烦恼的人. (4认同)
  • 非常有帮助,谢谢。将其分解为一种方法比尝试在三元运算符中包装逻辑要有意义得多,以这种方式很难理解。 (2认同)

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)