Как использовать 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.
Ответы
Ответ 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);
}