Подтвердить что ты не робот

Как использовать subList()

У меня есть страница JSF, в которой отображается список файлов журнала Glassfish. Я использую ленивую загрузку для разбивки на страницы. Я сохраняю список имен файлов журналов в Java List.

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.

4b9b3361

Ответ 1

Использование subList(30, 38); завершится неудачно, потому что max index 38 недоступен в списке, поэтому его невозможно.

Прежде чем запрашивать подсписку, возможно только путь, вы явно определяете максимальный индекс, используя метод list().

например, проверьте размер, который возвращает 35, поэтому вызовите sublist(30, size());

ИЛИ

COPIED FROM pb2q comment

dataList = dataList.subList(30, 38 > dataList.size() ? dataList.size() : 38);

Ответ 2

Чтобы получить последний элемент, просто используйте размер списка в качестве второго параметра. Например, если у вас есть 35 файлов, и вы хотите последние пять, вы бы сделали:

dataList.subList(30, 35);

Гарантированный безопасный способ сделать это:

dataList.subList(Math.max(0, first), Math.min(dataList.size(), last) );

Ответ 3

Я реализовал и протестировал это; он должен охватывать большинство баз:

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);
}