2011-10-25 19 views
68

Tengo una colección c1<MyClass> y una matriz a<MyClass>. Estoy tratando de convertir la matriz a una colección c2 y hacer c1.removeAll(c2), pero esto arroja UnsupportedOperationException. Encontré que el asList() de la clase Arrays devuelve la clase Arrays.ArrayList y esta clase hereda el removeAll() del AbstractList() cuya implementación arroja UnsupportedOperationException.remove() en la lista creada por Arrays.asList() throws UnsupportedOperationException

Myclass la[] = getMyClass(); 
    Collection c = Arrays.asList(la); 
    c.removeAll(thisAllreadyExistingMyClass); 

¿Hay alguna manera de eliminar los elementos? por favor ayuda

+0

pregunta relacionada: http://stackoverflow.com/questions/2965747/why-i-get- unsupportedoperationexception-when-trying-to-remove-from-the-list – Ram

Respuesta

119

Arrays.asList devuelve un contenedor List alrededor de una matriz. Esta envoltura tiene un tamaño fijo y está directamente respaldada por la matriz, y como tal, las llamadas a set modificarán la matriz, y cualquier otro método que modifique la lista generará un UnsupportedOperationException.

Para solucionar esto, debe crear una nueva lista modificable copiando el contenido de la lista de contenido. Esto es fácil de hacer mediante el constructor que toma un ArrayListCollection: Sí

Collection c = new ArrayList(Arrays.asList(la)); 
+11

+1 para señalar que, de hecho, no se puede modificar. –

+0

sí, set() no arroja la excepción – javalearner

+0

Estaba buscando el código fuente para el método 'java.util.Arrays'' asList() ', y parece devolver un' ArrayList'. Sin embargo, cuando hago un 'System.out.println (list.getClass());', obtengo 'clase java.util.Arrays $ ArrayList'. Por lo tanto, utiliza la clase interna 'ArrayList', que no tiene un método' add' o 'remove'. Me pregunto qué sentido tiene tener una clase 'ArrayList' interna en lugar de usar' java.util.ArrayList' y ¿por qué no tener un método 'add()' y 'remove()'? – Abdul

13

, la colección Arrays.asList(..) es que no se puede expandir o contraer (porque está respaldado por la matriz original, y se puede' t ser redimensionado).

Si desea quitar elementos o bien crear un new ArrayList(Arrays.asList(..) o eliminar elementos directamente de la matriz (que será menos eficiente y más difícil de escribir)

+0

+1 Esta respuesta es la única correcta: Arrays.asList() devuelve una lista * no modificable * - eso es lo que arroja la excepción. No tiene nada que ver con que esté "respaldado por una matriz", etc. * * ArrayLists está respaldado por matrices, lo cual es un gran problema. – Bohemian

+0

@Bohemian Quizás debería volver a leer mi respuesta, porque creo que cumplo con sus requisitos. –

+0

¡Todas las matrices son de tamaño fijo! Su respuesta ofrece solo información irrelevante – Bohemian

6

Esa es la forma Array.asList() obras, porque está respaldada directamente por el formación. Para obtener una lista completamente modificable, debe clonar la colección en una colección creada por usted mismo.

Collection c = new ArrayList(Arrays.asList(la)) 
+1

La lista es modificable pero solo a través de set(). la colección devuelta es de tamaño fijo. – javalearner

+0

Nunca dije que no se pudiera modificar. Solo que para obtener una lista (totalmente) modificable, tendría que usar un 'ArrayList'. La diferencia quizás no fue muy clara. :-) Si la lista es modificable o no es una cuestión de definición, es "semi-modificable" pero no totalmente modificable en mi opinión. – henko

-2

Para corregir este error, También puede intentar this.I esperanza esto es útil

List<ChunkId> idList = new ArrayList<>(); 
    idList.addAll(Arrays.asList(ids.toArray(new ChunkId[0]))); 
Cuestiones relacionadas