¿Cómo obtengo una porción de matriz de un ArrayList
en Java? Específicamente, quiero hacer algo como esto:
ArrayList<Integer> inputA = input.subList(0, input.size()/2);
// where 'input' is a prepouplated ArrayList<Integer>
Así que esperaba que esto funcionara, pero Java devuelve un List
, por lo que es incompatible. Y cuando intento lanzarlo, Java no me deja. Necesito un ArrayList
- ¿qué puedo hacer?
ArrayList
? Creo que puede carecer de un poco de comprensión de cómo funcionan porque las interfacesList
yArrayList
no son “incompatibles” -ArrayList
implementosList
, yList
probablemente contiene todos los métodos necesarios que necesita.ArrayList
porque luego necesita llamar a un método con él que acepta unArrayList
. Podría decirse que este método está mal diseñado y debería aceptarseList
, pero tales situaciones pueden surgir no solo en las preguntas de la entrevista, sino también en el código escrito por otros que uno no puede simplemente ir y cambiar. Los compañeros de trabajo y las bibliotecas no siempre son perfectos.Respuestas:
En Java, es una buena práctica utilizar tipos de interfaz en lugar de clases concretas en las API.
Tu problema es que estás usando
ArrayList
(probablemente en muchos lugares) donde realmente deberías usarList
. Como resultado, se creó problemas con la restricción innecesaria de que la lista es unaArrayList
.Así es como debería verse su código:
List input = new ArrayList(...); public void doSomething(List input) { List inputA = input.subList(0, input.size()/2); ... } this.doSomething(input);
Su "solución" propuesta al problema fue / es la siguiente:
new ArrayList(input.subList(0, input.size()/2))
Eso funciona haciendo una copia de la sublista. No es una tajada en el sentido normal. Además, si la sublista es grande, realizar la copia será costoso.
Si está limitado por las API que no puede cambiar , de modo que debe declarar
inputA
como unaArrayList
, es posible que pueda implementar una subclase personalizada deArrayList
en la que elsubList
método devuelve una subclase deArrayList
. Sin embargo:ArrayList
clase.ArrayList
instancias para crear instancias de su subclase en su lugar.La solución "copiar la matriz" es más práctica ... teniendo en cuenta que estos no son cortes verdaderos.
fuente
new ArrayList(input.subList(0, input.size()/2))
He encontrado una manera si conoce startIndex y endIndex de los elementos que se deben eliminar de ArrayList
Dejado
al
ser el ArrayList original ystartIndex
,endIndex
ser iniciar y índice de extremo a ser eliminado de la matriz, respectivamente:al.subList(startIndex, endIndex + 1).clear();
fuente
Si no hay un método existente, supongo que puede iterar de 0 a
input.size()/2
, tomando cada elemento consecutivo y anexándolo a una nueva ArrayList.EDITAR : En realidad, creo que puede tomar esa Lista y usarla para crear una instancia de una nueva ArrayList usando uno de los constructores ArrayList .
fuente
Aunque esta publicación es muy antigua. En caso de que alguien esté buscando esto ...
Guava facilita la partición de la Lista en sublistas de un tamaño específico
List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8); List<List<Integer>> subSets = Lists.partition(intList, 3);
fuente
Así es como lo resolví. Olvidé que la sublista era una referencia directa a los elementos de la lista original, por lo que tiene sentido por qué no funcionaría.
ArrayList<Integer> inputA = new ArrayList<Integer>(input.subList(0, input.size()/2));
fuente