2012-05-17 11 views
7

Quiero eliminar elementos específicos de mi lista. No quiero hacer esto mientras repito la lista. Quiero especificar el valor que tiene que ser eliminado. En javadocs me encontré con la función List.remove(Object 0) Este es mi código:eliminando un valor de una lista <String> en java throws java.lang.UnsupportedOperationException

  String str="1,2,3,4,5,6,7,8,9,10"; 
     String[] stra=str.split(","); 
     List<String> a=Arrays.asList(stra); 
     a.remove("2"); 
     a.remove("3"); 

Pero consigo una excepción: java.lang.UnsupportedOperationException

Respuesta

22

El problema es que Arrays.asList() devuelve una lista que no admite la inserción/extracción (que es simplemente una vista en stra).

Para el montaje, el cambio:

List<String> a = Arrays.asList(stra); 

a:

List<String> a = new ArrayList<String>(Arrays.asList(stra)); 

Esto hace una copia de la lista, lo que le permite modificarlo.

+0

Funciona. gracias ¿Qué pasaba con mi método? List a = Arrays.asList (stra); La excepción no fue lanzada en esta línea. – Ashwin

+0

@Ashwin: Esa línea estaba bien. Sin embargo, la lista producida por 'Arrays.asList()' es de solo lectura, por lo que no puede modificarla. Primero debes hacer una copia. – NPE

+0

bien ... con mi método, ¿estaba la lista simplemente accediendo a los valores de cadena [] directamente sin hacer una copia propia? Entonces, si se permitieran cambios, afectarían a String [] también ¿no? – Ashwin

2

http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList%28T...%29

ver esto. Arrays.asList devuelve una lista fija. Que es inmutable Según su definición, no puede modificar ese objeto una vez que lo crea. Esto explica por qué está lanzando una excepción no admitida.

+1

Una cuerda también es inmutable. Pero cuando modifica una cadena, se le asigna una nueva ubicación de memoria e internamente se crea una nueva cadena. Entonces efectivamente puedes modificar una cadena inmutable. Así que no creo que la razón sea que la lista devuelta es inmutable. Creo que es porque cuando estás haciendo Arrays.asList() solo hace referencia a la cadena [] (no copia la cadena [] y hace una lista). – Ashwin

+0

Si echas un vistazo a la clase interna, llama a AraayList en la clase Arrays y te darás cuenta de que no se puede modificar. Simplemente use una final privada E [] a; esa es la razón por la que no puedes modificar la lista de retorno. En el caso de una cadena, no puedes modificar una cadena una vez que la hayas creado. Pero en la clase de cadena API se desarrolla de una manera que manejará las modificaciones internamente mediante la creación de un nuevo objeto. –

+0

Entonces está diciendo que crea una copia de la cadena [] pero la declara como final. ¿Estás diciendo que no hace referencia a la cadena [] y almacena una copia propia (pero como final)? – Ashwin

Cuestiones relacionadas