2012-10-11 2 views
0

Je voudrais utiliser la collection générique non triée pour stocker des valeurs.Ajouter une nouvelle ligne à la fin de la collection

Set<Integer> map = new HashSet<Integer>(); 
map.Add(new Integer(3)); 
map.Add(new Integer(2)); 
map.Add(new Integer(4)); 
map.Add(new Integer(1)); 

Je suppose que les éléments seraient 3,2,4,1. Je voudrais créer un tableau à partir de cet ensemble:

Integer[] arr = (Integer[])map.toArray(new Integer[map.size()]); 

Je suis surpris parce que les éléments arr sont dans un ordre différent que je mets dans la carte. L'affaire est d'obtenir un tableau comme celui-ci:

arr[0] = 3; 
arr[1] = 2; 
arr[2] = 4; 
arr[3] = 1; 

Que dois-je faire pour cela?

+3

Avez-vous lu le JavaDoc? – home

+0

peut-être qu'un ArrayList vous aidera mieux – MaVRoSCy

+0

Selon JavaDoc 'Cette classe implémente l'interface Set, soutenue par une table de hachage (en fait une instance de HashMap). Il ne donne aucune garantie quant à l'ordre d'itération de l'ensemble; en particulier, il ne garantit pas que la commande restera constante au fil du temps. C'est pourquoi ils ne sont pas dans l'ordre où vous les mettez – MaVRoSCy

Répondre

5

HashSet ne garantit pas que la commande restera la même. Si vous souhaitez maintenir l'ordre, utilisez ArrayList.

+1

Ou n'importe quelle classe qui implémente 'List' (comme' ArrayList', 'LinkedList', etc) .- –

+2

+1 ou utilise' LinkedHashSet' –

+0

Peter +1, comme l'a écrit @zuxqoj dans sa solution. –

2

Les ensembles sont non ordonnés. Il n'est pas garanti de maintenir l'ordre des éléments. Vous devez utiliser une liste si la commande que vous avez ajouté les éléments doit rester la même.

List<Integer> map = new ArrayList<Integer>(); 
map.add(new Integer(3)); 
map.add(new Integer(2)); 
map.add(new Integer(4)); 
map.add(new Integer(1)); 
+0

Belle explication de pourquoi une 'List' est nécessaire, et l'utilisation propper de son interface. –

2

utilisation LinkedHashSet au lieu de HashSet

Set<Integer> map = new LinkedHashSet<Integer>(); 
    map.add(new Integer(3)); 
    map.add(new Integer(2)); 
    map.add(new Integer(4)); 
    map.add(new Integer(1)); 

    Integer[] arr = (Integer[])map.toArray(new Integer[map.size()]); 

    System.out.println(Arrays.toString(arr)); 
0

Vous pouvez utiliser LinkedHashSet pour préserver l'ordre d'entrée:

Set<Integer> map = new LinkedHashSet<Integer>(); 
Questions connexes