2009-12-28 3 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; 

Voici l'erreur msg:Java - Comment convertir une collection de types en ArrayList?

Exception dans le thread "principal" java.lang.ClassCastException: java.util.Collections $ UnmodifiableCollection ne peut pas être castée java.util.ArrayList ..

Quelqu'un peut-il aider?

+0

boucle à travers et il suffit d'ajouter les nœuds. –

+2

Veuillez poster plus de code, à tout le moins les déclarations et les initialisations de tous les éléments participants. Idéalement, postez un petit programme qui compile et fonctionne et démontre votre problème. Simplifier votre programme de cette manière vous dirigera souvent vers la solution. – sleske

Répondre

65

Comme d'autres personnes l'ont mentionné, ArrayList a un constructeur qui prend une collection d'éléments et les ajoute tous. Voici la documentation:

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

Vous devez faire:

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

Cependant, dans un autre commentaire que vous avez dit que vous donnait une erreur de compilation. Il semble que votre classe MyGraph soit une classe générique. Ainsi, getVertices() renvoie réellement le type V, pas le type myNode.

Je pense que votre code devrait ressembler à ceci:

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

Mais, qui a dit qu'il est une façon très inefficace pour extraire un nœud. Ce que vous pourriez vouloir faire est de stocker les nœuds dans un arbre binaire, puis quand vous obtenez une requête pour le nième nœud, vous faites une recherche binaire.

+0

Got it, thanks! – user236691

+0

Méfiez-vous qu'il renvoie une copie superficielle. Pas une référence à la liste en fait. – zgulser

1

Plus d'informations nécessaires à une réponse définitive, mais ce code

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

sera seulement travail si this.getVertices() retourne un (sous-type de) List<MyNode>. S'il est une autre collection (comme votre exception semble indiquer), vous souhaitez utiliser

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

Cela fonctionne aussi longtemps que le type de collection est retourné par getVertices.

+0

Il renvoie un type de colletion ... mais celui-ci nouvelle ArrayList (this.getVertices()) ne fonctionne pas .. – user236691

18

Essayez ce code

Convertir ArrayList Collection

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

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

Collection Convertir ArrayList

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

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

Extrêmement utile! –

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; 
} 

Utilisez la méthode ci-dessus pour la conversion de la collec tion à la liste

2

Le code suivant échouera:

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

Cela au lieu de travailler:

List<String> will_work = new ArrayList<String>(Collections.unmodifiableCollection(new ArrayList<String>())); 
Questions connexes