Tengo una colección c1<MyClass>
y una matriz a<MyClass>
. Estoy tratando de convertir la matriz en una colección c2
y lo hago c1.removeAll(c2)
, pero esto arroja UnsupportedOperationException
. Descubrí que la asList()
clase of Arrays devuelve la Arrays.ArrayList
clase y esta clase hereda la removeAll()
de AbstractList()
cuya implementación arroja UnsupportedOperationException
.
Myclass la[] = getMyClass();
Collection c = Arrays.asList(la);
c.removeAll(thisAllreadyExistingMyClass);
¿Hay alguna forma de eliminar los elementos? por favor ayuda
Respuestas:
Arrays.asList
devuelve unaList
envoltura alrededor de una matriz. Este contenedor tiene un tamaño fijo y está respaldado directamente por la matriz, y como tal, las llamadas aset
modificarán la matriz, y cualquier otro método que modifique la lista arrojará unUnsupportedOperationException
.Para solucionar esto, debe crear una nueva lista modificable copiando el contenido de la lista contenedora. Esto es fácil de hacer usando el
ArrayList
constructor que toma unCollection
:fuente
java.util.Arrays
asList()
método y parece devolver unArrayList
. Sin embargo, cuando hago unSystem.out.println(list.getClass());
, obtengoclass java.util.Arrays$ArrayList
. Entonces usa laArrayList
clase interna , que no tiene un métodoadd
oremove
. Me pregunto cuál es el punto de tener unaArrayList
clase interna en lugar de usarjava.util.ArrayList
una y por qué no tener un métodoadd()
yremove()
.add
yremove
java.util.ArrayList
. Desea una implementaciónList
que arroje una excepción si hace algo ilegal con ella (como agregar o eliminar), yArrayList
no cumple con ese requisito.Arrays.asList
solo crea un contenedorList
. Pero sigue siendo unjava.util.List
, por lo que debe tener esos métodos. Pero no se pueden aplicar porque eso llevaría a crear una nueva matriz con un tamaño diferente. Lo cual no se puede hacer porque las modificaciones que aún puede hacer se pueden realizar tanto a través de la Lista devuelta como de la matriz original. Esto no será posible si la Lista devuelta pudiera cambiar de modo que básicamente desechara la referencia de matriz original.Sí, la
Arrays.asList(..)
colección es que no se puede expandir ni reducir (porque está respaldada por la matriz original y no se puede cambiar de tamaño).Si desea eliminar elementos, cree
new ArrayList(Arrays.asList(..)
o elimine elementos directamente de la matriz (eso será menos eficiente y más difícil de escribir)fuente
Esa es la forma en que
Array.asList()
funciona, porque está respaldado directamente por la matriz. Para obtener una lista completamente modificable, tendría que clonar la colección en una colección creada por usted mismo.fuente
ArrayList
. Sin embargo, la diferencia quizás no fue demasiado clara. :-) Si la lista es modificable o no es una cuestión de definición, es "semi-modificable" pero no completamente modificable en mi opinión.