Vista de un Array como List y viceversa en java

Java nos ofrece un conjunto de métodos que nos permiten manipular elementos de un tipo de colección A como si pertenecerieran a un tipo de colección B. Este conjunto de métodos es conocido como vistas.

En este artículo particularmente nos vamos a enfocar en explicar como obtener una vista de un Arrays como una colección de tipo List y viceversa, es decir obtener un Arrays desde una List (que será un LinkedList).

Cuál es la idea detrás de todo esto? Supongamos que por alguna razón queremos insertar elementos en la mitad de un Arrays, o bien agregar elementos al final del mismo. Como sabemos, esto no se puede hacer en un objeto de tipo Arrays, ya que los mismos son de tamaño fijo

La clase Arrays nos provee del método asList() que devuelve una vista del mismo como una colección List. Esta vista nos va a permitir manipular el arreglo como si fuera una lista, con las bondades que ello significa. Cualquier modificación que se haga a la List que es la vista del Array, cambiará al Array, así también, cualquier modificacion que se haga al Array cambiará la vista de la List.

Les presento este ejemplo para entender de que hablamos:

import java.util.Arrays;
import java.util.LinkedList;

public class ListView{

public static void main(String[] args){

//An array containing brand of cars
String[] cars = {"Volvo", "Volkswagen","Ford","Hitachi"};

//Create a LinkedList with all elements from cars
LinkedList<String> carlinks = new LinkedList<String>(Arrays.asList(cars));

carlinks.addFirst("Ferrari");
carlinks.addLast("Lamborghini");
carlinks.add("BMW");

//Assing to cars an array containing all elements from carlinks
cars = carlinks.toArray(new String[ carlinks.size() ]);

System.out.println("Cars Brands: ");

for (String car: cars){
System.out.println(car);
}
}
}

 


 



Hay varias cosas por comentar acá, manos a la obra. La línea

LinkedList<String> carlinks = new LinkedList<String>(Arrays.asList(cars));

crea un objeto nuevo LinkedList tomando como parámetro una vista de Listdel array String cars. No podríamos crear el objeto LinkedList pasandole como parámetro solamente el Array cars.

Una vez que creamos nuestro objeto LinkedList estamos en condiciones de tratarlo completamente como una List, es decir podemos agregar elementos, quitarlos y modificarlos.

Hay que hacer una salvedad MUY IMPORTANTE acá y es que a la vista que nos que nos devuelve Arrays, no se le pueden agregar ni quitar elementos, sólo se los puede modificar, cuestión que lo vamos a ver en instantes. Pero y entonces como pudimos hacerlo en nuestro ejemplo? al hacer new LinkedList<String>… lo que paso es que creamos un nuevo objeto tomando como parámetro la vista y esto nos devolvió un nuevo objeto LinkedList seteado con los elementos que hasta el momento tenia el arreglo String.

Como mencionamos más arriba, al tener nuestro objeto LinkedList, podemos tratarlo como tal y agregar elementos al comienzo, en el medio, al final e incluso remover elementos a gusto y piaccere.

Finalmente, la línea

cars = carlinks.toArray(new String[ carlinks.size() ]);

usa el método toArray(), el cual devuelve un arreglo que es una copia de los elementos de la lista. Esto implica que si modificamos el contenido de este arreglo no se modificará el contenido de la lista.

El resultado de nuestro código es este

Cars Brands:
Ferrari
Volvo
Ford
Hitachi
Lamborghini
BMW

 

Tratando de modificar una vista

Hagamos algunas modificaciones al código anterior a ver que pasa:

import java.util.Arrays;
import java.util.List;

public class ListViewErrors{

public static void main(String[] args){

//An array containing brand of cars
String[] cars = {"Volvo", "Volkswagen","Ford","Hitachi"};

//Create a LinkedList with all elements from cars
List<String> carlinks = Arrays.asList(cars);

carlinks.add("Ferrari");
carlinks.add("Lamborghini");
carlinks.add("BMW");
carlinks.remove(2);
//Assing to cars an array containing all elements from carlinks
cars = carlinks.toArray(new String[ carlinks.size() ]);

System.out.println("Cars Brands: ");

for (String car: cars){
System.out.println(car);
}
}
}

A simple vista este código no tiene errores, pero cuando lo ejecutamos obtenemos lo siguiente:

Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at ListViewErrors.main(ListViewErrors.java:16)

Una excepción de tipo UnsupportedOperationException. La razón de esto es que estamos queriendo insertar y remover elementos de una vista

List<String> carlinks = Arrays.asList(cars);

En este caso y a diferencia del anterior, nuestra List carlinks hace referencia directamente a la vista, en vez de a un objeto diferente.

El método asList() en realidad retorna una lista de tamaño fijo, con lo cual cualquier intento por cambiar su tamaño dispara una excepción.

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

16 + 5 =