2009-12-28 16 views
38
public class MyGraph<V,E> extends SparseMultigraph<V,E>{ 
    private ArrayList<MyNode> myNodeList; 

    public MyNode getNode(int nodeId){ 
     myNodeList = new ArrayList<MyNode>(); 
     myNodeList = (ArrayList<MyNode>)this.getVertices(); 
     int i; 

Los siguientes son los msg del error:Java - ¿Cómo convertir la colección de tipos en ArrayList?

Excepción en hilo java.lang.ClassCastException "principal": java.util.Collections $ UnmodifiableCollection no se puede convertir a java.util.ArrayList ..

¿Alguien puede ayudar?

+0

bucle a través y sólo tiene que añadir los nodos. –

+2

Por favor publique más código, por lo menos las declaraciones e inicializaciones de todos los elementos participantes. Idealmente, publique un pequeño programa que compila y ejecuta y demuestra su problema. Simplificar tu programa de esa manera a menudo ya te indicará la solución. – sleske

Respuesta

65

Como han mencionado otras personas, ArrayList tiene un constructor que toma una colección de elementos y los suma a todos. Aquí está la documentación:

http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html#ArrayList%28java.util.Collection%29

Así que hay que hacer:

ArrayList<MyNode> myNodeList = new ArrayList<MyNode>(this.getVertices()); 

Sin embargo, en otro comentario usted dijo que estaba dando un error de compilación. Parece que tu clase MyGraph es clase genérica. Y así getVertices() realmente devuelve tipo V, no escribe myNode.

creo que el código debería tener este aspecto:

public V getNode(int nodeId){ 
     ArrayList<V> myNodeList = new ArrayList<V>(this.getVertices()); 
     return myNodeList(nodeId); 
} 

embargo, que dijo que es una manera muy ineficiente para extraer un nodo. Lo que podría querer hacer es almacenar los nodos en un árbol binario, y luego cuando obtiene una solicitud para el n-nodo, realiza una búsqueda binaria.

+0

¡Lo tengo, gracias! – user236691

+0

Ten en cuenta que devuelve una copia poco profunda. No es una referencia a la lista en realidad. – zgulser

1

Más información necesaria para una respuesta definitiva, pero este código

myNodeList = (ArrayList<MyNode>)this.getVertices(); 

se única trabajo si devuelve un this.getVertices() (subtipo de) List<MyNode>. Si se trata de una colección diferente (como su excepción parece indicar), que desea utilizar

new ArrayList<MyNode>(this.getVertices()) 

Esto funcionará siempre como un tipo de colección es devuelto por getVertices.

+0

Devuelve un tipo de colección ... pero este nuevo ArrayList (this.getVertices()) no funciona .. – user236691

18

Prueba este código

ArrayList Convertir a Colección

ArrayList<User> usersArrayList = new ArrayList<User>(); 

    Collection<User> userCollection = new HashSet<User>(usersArrayList); 

Colección Convertir a ArrayList

Collection<User> userCollection = new HashSet<User>(usersArrayList); 

    List<User> userList = new ArrayList<User>(userCollection); 
+0

¡Extremadamente útil! –

4
public <E> List<E> collectionToList(Collection<E> collection) 
{ 
    List<E> list; 
    if (collection instanceof List) 
    { 
     list = (List<E>) collection; 
    } 
    else 
    { 
     list = new ArrayList<E>(collection); 
    } 
    return list; 
} 

Utilice el método anterior para la conversión de la colec ción a la lista

2

El siguiente código se producirá un error:

List<String> will_fail = (List<String>)Collections.unmodifiableCollection(new ArrayList<String>()); 

Esta vez va a funcionar:

List<String> will_work = new ArrayList<String>(Collections.unmodifiableCollection(new ArrayList<String>())); 
Cuestiones relacionadas