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);
목록 외부에서 색인을 얻고 싶기 때문에 오류 색인이 잘못되었습니다. 예를 들어 30에서 35까지 List 요소를 반환하는 방법은 무엇입니까? 30에서 40까지의 인덱스를 얻고 싶지만 35 개의 인덱스 만 있으면 5 만 얻을 수 있습니다.
답변
subList(30, 38);
목록에서 최대 인덱스 38을 사용할 수 없으므로 사용할 수 없으므로 사용 이 실패합니다.
유일한 방법은 하위 목록을 요청하기 전에 목록 크기 () 메서드를 사용하여 명시 적으로 최대 인덱스를 결정하는 것입니다.
예를 들어, 크기를 확인하면 35를 반환하므로 sublist(30, size());
또는
pb2q 주석에서 복사 됨
dataList = dataList.subList(30, 38 > dataList.size() ? dataList.size() : 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);
}
답변
마지막 요소를 얻으려면 목록의 크기를 두 번째 매개 변수로 사용하십시오. 예를 들어, 35 개의 파일이 있고 마지막 5 개 파일을 원하면 다음을 수행합니다.
dataList.subList(30, 35);
이를위한 확실한 안전한 방법은 다음과 같습니다.
dataList.subList(Math.max(0, first), Math.min(dataList.size(), last) );
답변
Java 8에서 스트림을 사용할 수 있습니다. 항상 최대 10 개의 항목을 얻으려면 다음을 수행하십시오.
dataList.stream().skip(5).limit(10).collect(Collectors.toList());
dataList.stream().skip(30).limit(10).collect(Collectors.toList());