remove metodos example java arraylist sublist

java - metodos - package arraylist



¿Cómo tomar una sublista válida en Java? (6)

Tengo este extraño problema (creo) en Java. Tengo una ArrayList y quiero tomar una sublista. Pero obtengo la siguiente excepción.

package javatest; import java.util.ArrayList; public class JavaTest { public static void main(String[] args) { ArrayList<Integer> alist = new ArrayList<Integer>(); alist.add(10); alist.add(20); alist.add(30); alist.add(40); alist.add(50); alist.add(60); alist.add(70); alist.add(80); ArrayList<Integer> sub = (ArrayList<Integer>) alist.subList(2, 4); for (Integer i : sub) System.out.println(i); } }

ejecutar: Excepción en el hilo "principal" java.lang.ClassCastException: java.util.RandomAccessSubList no se puede convertir a java.util.ArrayList en javatest.JavaTest.main (JavaTest.java:17) Resultado de Java: 1

¿Cuál es la forma correcta de tomar una sublista?

Gracias


Cambiar el código a:

List<Integer> sub = alist.subList(2, 4);

El método sublist() devuelve una List , que no necesariamente es una ArrayList (aquí en realidad es una RandomAccessSublist , que es la razón por la cual el elenco falla).


Debería trabajar con las interfaces para Colecciones siempre que sea posible. Está descifrando el resultado de la sublista, pero la API especifica que devuelve List ( no ArrayList ). Aquí, los implementadores eligen devolver un tipo diferente para facilitarles la vida.

Además, la documentación API especifica que la sublista devolverá una lista asignada al original, ¡así que ten cuidado!


Prueba esto...

List<Integer> alist = new ArrayList<Integer>(); alist.add(10); alist.add(20); alist.add(30); alist.add(40); alist.add(50); alist.add(60); alist.add(70); alist.add(80); List<Integer> sub = alist.subList(2, 4); for (Integer i : sub) System.out.println(i);


Tratar

List<Integer> sub = alist.subList(2, 4);


hazlo como:

List sublist = new ArrayList(); sublist = new ArrayList<String>(alist.subList(2, 4));

y debería funcionar


public List<E> subList(int fromIndex, int toIndex) { return (this instanceof RandomAccess ? new RandomAccessSubList<E>(this, fromIndex, toIndex) : new SubList<E>(this, fromIndex, toIndex)); }

como en la impl de ArrayList, es la Lista de retorno, ya que @George Kastrinis dijo que usa la interfaz siempre que sea posible.