2012-08-23 15 views
53

Tengo una página JSF que muestra la lista de archivos de registro de Glassfish. Uso la carga diferida para la paginación. Guardo la lista de los nombres de los archivos de registro en Java List.Cómo utilizar subList()

private List<directoryListObj> dataList = new ArrayList<>(); 

dataList = dataList.subList(firstRow, lastRow); 

Y aquí está el problema. Por ejemplo, tengo 35 archivos en el directorio. Cuando hago esto

dataList = dataList.subList(5, 15); 

Funciona bien. Pero cuando hago esto:

dataList = dataList.subList(30, 38); 

Obtengo error índice incorrecto porque quiero obtener un índice fuera de la Lista. ¿Cómo puedo, por ejemplo, devolver Elementos de la lista del 30 al 35? Quiero si quiero obtener un índice de 30 a 40, pero si solo hay 35 índices para obtener solo 5.

+9

'DataList = dataList.subList (30, 38> dataList.size() dataList.size(): 38?);' 'O – pb2q

+11

dataList.subList (30, Math. min (38, dataList.size()) ' –

+1

@ pb2q parece que ha perdido la posibilidad de una respuesta. –

Respuesta

59

El uso de subList(30, 38); fallará porque el índice máximo 38 no está disponible en la lista, por lo que no es posible.

La única manera puede ser antes de solicitar la sublista, usted determina explícitamente el índice máximo usando el método de tamaño de lista().

por ejemplo, el tamaño del cheque, que devuelve 35, por lo que llaman sublist(30, size());

O

copiado de comentario pb2q

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

@PaulBellora: Estás en lo correcto. Respuesta editada. – kosa

+0

¡Gracias a todos! – user1285928

+4

Eso también fallaría si la lista tiene menos de 30 artículos –

37

Para obtener el último elemento, basta con utilizar el tamaño de la lista como el segundo parámetro. Así, por ejemplo, si usted tiene 35 archivos, y desea que los últimos cinco, que haría:

dataList.subList(30, 35); 

Un garantizada manera segura de hacer esto es:

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

Eso también fallaría si 'primero' es mayor que el tamaño de la lista. –

+3

@Haroldo_OK: ¡o si 'last' es negativo! –

+0

También fallará si 'first> = last' – augurar

28

He implementado y probado éste; que debe cubrir la mayoría de las bases:

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

Esta debería ser la respuesta aceptada, la única que se molestó en probar su código. –

+1

Gracias, una pena que esto no forme parte de 'Arrays' ... –

+1

Muy útil, gracias. Romper esto en un método tiene más sentido que tratar de resumir la lógica en operadores ternarios, simplemente se vuelve demasiado difícil leer de esa manera. – Steve