2009-07-10 6 views
4

J'utilise le essai de code suivant pour créer un tableau de vecteurs de chaîne, j'espère avoir un tableau de 3 éléments, chaque élément est un vecteur de chaîne:Comment créer un tableau de vecteurs de chaînes en Java?

Vector<String> Result_Vector_Array[]=new Vector<String>[3]; 

Mais NB a souligné la ligne comme une erreur (tableau générique création), qu'est-ce qui ne va pas? Quelle est la bonne façon de le faire? Je sais qu'il y a aussi Arraylist, mais ce n'est pas synchronisé, donc je veux utiliser vector.

+0

Qu'est-ce qu'un vecteur de chaîne? – Mnementh

+0

Le vecteur n'est-il pas obsolète? – Tom

+0

P.S. Utilisez plutôt ArrayList !!! – jjnguy

Répondre

6

En raison de type erasure, la machine virtuelle Java ne sait pas à l'exécution que vous avez un Vector de String. Le mieux qu'il peut faire est de créer un vecteur «brut». Il ne peut pas garantir pour vous que tous les Vector contiennent réellement String s. C'est pourquoi vous recevez un avertissement de votre IDE.

Une façon de contourner ce problème, c'est de le lancer, comme le suggère jgubby. Une autre consiste à mettre un List dans votre Vector s, au lieu d'un tableau.

Mais, plus important encore, pourquoi le tableau ne peut avoir que 3 éléments? Ne serait-il pas préférable de créer une classe avec trois champs à mettre dans votre Vector? Avec trois éléments, ce n'est pas trop de travail, et vous obtenez le bonus supplémentaire que vous pouvez donner à chacun des trois éléments un nom utile, ce qui devrait rendre votre code beaucoup plus clair.

En outre, depuis Java 6, il existe un certain nombre de nouvelles List synchronisées utiles mises en œuvre, ce qui pourrait effectuer mieux que Vector, comme CopyOnWriteArrayList, ou envelopper une List régulière dans un Collections.synchronizedList.

+0

Créez un cours! Oui, bonne idée, qui ouvre la porte à beaucoup plus de choses, merci! – Frank

5

Vous ne pouvez pas créer un tableau comme ça, faites ceci:

Vector<String> Result_Vector_Array[] = (Vector<String>[]) new Vector[3]; 

je suggère une approche différente - tableaux de conteneurs comme qui sont souvent très difficiles à utiliser, et ne contribue pas à la compréhension votre code.

PS Il convient également de noter que la convention de nommage Java serait

Vector<String> resultVectorArray[] = (Vector<String>[]) new Vector[3]; 

et ce n'est pas d'habitude d'inclure le type dans le nom (je soupçonne que ce sera controversé!), Pourquoi ne pas simplement appeler ce résultat 'et laissez le système de type s'inquiéter du type?

+0

Je ne comprends pas pourquoi. Où est le type générique? String est une classe concrète, et si nous paramétrons Vector, Vector sera. Ou? – Geo

+0

Merci, j'utilise cette approche parce que je connais la dimension du tableau mais je ne sais pas combien d'éléments seront dans le vecteur, les vecteurs vont grandir au fur et à mesure, je ne connaîtrai pas leur taille avant que le travail soit terminé . De meilleures solutions? – Frank

0

utilisant la réflexion serait:

Vector<String>[] arrayOfVectors = 
     (Vector<String>[]) java.lang.reflect.Array.newInstance(Vector.class, size); 
    java.util.Arrays.fill(arrayOfVectors, new Vector<String>()); 
    for (Vector<String> v : arrayOfVectors) { 
     System.out.println(v); 
    } 

vous pouvez également utiliser une ArrayList puis l'envelopper en utilisant Collections#synchronizedList(java.util.List)

+0

Pourquoi ???????????? –

+0

parce que vous ne pouvez pas créer un tableau en tant que vecteur Result_Vector_Array [] = (Vector []) new Vector [3]; – dfa

1

Vous pouvez également créer:

Vector<Vector<String>> Result_Vector_Array=new Vector<Vector<String>>(); 

Ou vous pouvez remplacer Vector avec une autre collection.

1

Je vous suggère de garder des collections, faire quelque chose comme

Collection<Vector<String>> resultVectorArray = new ArrayList<Vector<String>>(3); 

Ensuite, vous pouvez utiliser les génériques avec le constructeur et parlé pratiquement le même effet

+0

La liste sera suffisante. – OscarRyz

0

Si vous souhaitez utiliser un ArrayList synchronisé, vous pouvez utiliser la méthode synchronizedList dans java.util.Collections.

ArrayList<String> a1 = new ArrayList<String>(); 
ArrayList<String> a2= new ArrayList<String>(); 
ArrayList<String> a3 = new ArrayList<String>(); 

ArrayList<String> array[] = (ArrayList<String>[]) new ArrayList[3]; 

array[0]= Collections.synchronizedList(a1); 
array[1]= Collections.synchronizedList(a2); 
array[2]= Collections.synchronizedList(a3); 
-1

Si ce tableau? ...

Je comprends que vous allez utiliser multithread Si vous n'êtes pas, alors vous n'avez pas à vous soucier de la synchronisation.

Je voudrais:

List<List<String>> listOfLists = new ArrayList<List<String>>(); 

    List<String> firstVector = new ArrayList<String>(); 

    firstVector.add("one"); 
    firstVector.add("two"); 

    listOfLists.add( firstVector); 

    System.out.println(listOfLists.get(0).get(0) == "one"); 
    System.out.println(listOfLists.get(0).get(1) == "two"); 

Prints true, true

Questions connexes