2009-09-26 30 views
49

¿Cómo obtengo una porción de matriz de ArrayList en Java? Específicamente quiero hacer algo como esto:¿Cómo puedo cortar una ArrayList de una ArrayList en Java?

ArrayList<Integer> inputA = input.subList(0, input.size()/2); 
// where 'input' is a prepouplated ArrayList<Integer> 

así que esperaba que esto funcione, pero Java devuelve un List - por lo que es incompatible. Y cuando intento lanzarlo, Java no me deja. Necesito un ArrayList - ¿qué puedo hacer?

+4

¿Por qué insistes en usar una 'ArrayList'? Creo que puede faltarle un poco para entender cómo funcionan las interfaces porque 'List' y' ArrayList' no son "incompatibles" -'ArrayList' implementa 'List', y' List' probablemente contiene todos los métodos necesarios que necesita. – Bombe

+2

Insisto en utilizar ArrayList porque es una pregunta de entrevista con un prototipo de método rígido. Claramente tengo una falta de comprensión, porque subList se supone que devuelve un tipo de lista, y sin embargo, no puedo convertir la lista devuelta a ArrayList. Así que dime hombre ... –

+4

Es muy posible que necesite una 'ArrayList' porque luego necesita llamar a un método que acepte una' ArrayList'. Podría decirse que dicho método está mal diseñado y debería aceptar 'List', pero tales situaciones pueden surgir no solo en las preguntas de la entrevista, sino también en un código escrito por otros que no se puede simplemente cambiar. Los compañeros de trabajo y las bibliotecas no siempre son perfectos. – Gravity

Respuesta

86

En Java, es una buena práctica usar 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 estar usando List. Como resultado, creó problemas para usted con una restricción innecesaria que la lista es ArrayList.

Esto es lo que el código debe ser similar:

List input = new ArrayList(...); 

public void doSomething(List input) { 
    List inputA = input.subList(0, input.size()/2); 
    ... 
} 

this.doSomething(input); 

Su propuesta de "solución" al problema era/es la siguiente:

new ArrayList(input.subList(0, input.size()/2)) 

que funciona haciendo una copia de la sublista No es una rebanada en el sentido normal. Además, si la sublista es grande, entonces hacer la copia será costoso.


Si está limitado por las API que no puede cambiar, de tal manera que se tiene que declaran inputA como ArrayList, usted podría ser capaz de implementar una subclase personalizada de ArrayList en el que los subList devuelve el método una subclase de ArrayList. Sin embargo:

  1. Sería mucho trabajo diseñar, implementar y probar.
  2. Ahora ha agregado una nueva clase significativa a su base de código, posiblemente con dependencias en aspectos no documentados (y por lo tanto, "sujeto a cambios") de la clase ArrayList.
  3. Debería cambiar lugares relevantes en su base de código donde está creando instancias ArrayList para crear instancias de su subclase.

La solución "copiar la matriz" es más práctica ... teniendo en cuenta que estas no son verdaderas rebanadas.

+3

En realidad, subList no hace una copia; devuelve una vista en la lista original (http://docs.oracle.com/javase/6/docs/api/java/util/List.html#subList%28int,%20int%29) – Matthew

+2

Actualmente @Matthew, I Me estoy refiriendo a la auto-respuesta del OP donde hace esto: 'new ArrayList (input.subList (0, input.size()/2))' –

6

Si no hay un método existente, entonces supongo que puede recorrer de 0 a input.size()/2, tomando cada elemento consecutivo y anexándolo a una nueva ArrayList.

EDIT: En realidad, creo que puede tomar esa lista y usarla para crear una nueva ArrayList usando one of the ArrayList constructors.

+2

Eso es exactamente lo que hice (publiqué mi respuesta antes de leer su edición) Gracias:) –

+0

Pero eso * copia * la Lista para crear una nueva ArrayList. – Joren

+2

@BT - Para el registro, eso no es lo que el término "slice" normalmente significa en este contexto. –

-4

Así lo resolví. Olvidé que la sublista era una referencia directa a los elementos en la lista original, por lo que tiene sentido por qué no funcionaría.

ArrayList inputA = new ArrayList (input.subList (0, input.size()/2));

2

Me han encontrado una manera si usted sabe startIndex y endIndex de los elementos de una necesidad de suprimir del ArrayList

Vamos al ser ArrayList original y startIndex, endIndex puede empezar y el índice final que se quitan de la matriz, respectivamente :

al.subList(startIndex, endIndex + 1).clear(); 
Cuestiones relacionadas