web-dev-qa-db-fra.com

Comment faire pour chacun le hashmap?

J'ai ce champ:

HashMap<String, HashMap> selects = new HashMap<String, HashMap>();

Pour chaque Hash<String, HashMap> j'ai besoin de créer un ComboBox, dont les éléments sont la valeur (qui se trouve être une table de hachage elle-même) de HashMap <String, **HashMap**>.

À titre de démonstration (non fonctionnelle):

for (int i=0; i < selects.size(); i++) {
    HashMap h = selects[i].getValue();
    ComboBox cb = new ComboBox();

    for (int y=0; y < h.size(); i++) {
        cb.items.add(h[y].getValue);
    }
}
467
Mediator

Je sais que je suis un peu en retard pour celui-là, mais je vais partager ce que j'ai fait aussi, au cas où cela aiderait quelqu'un d'autre:

HashMap<String, HashMap> selects = new HashMap<String, HashMap>();

for(Map.Entry<String, HashMap> entry : selects.entrySet()) {
    String key = entry.getKey();
    HashMap value = entry.getValue();

    // do what you have to do here
    // In your case, another loop.
}
1125
Cyril N.

Lambda Expression Java 8

Dans Java 1.8 (Java 8), cela est devenu beaucoup plus facile en utilisant la méthode forEach des opérations Aggregate ( Opérations de flux ) similaires aux itérateurs de Iterable Interface.

Il suffit de copier-coller l’instruction ci-dessous dans votre code et de renommer la variable HashMap de hm à votre variable HashMap pour imprimer la paire clé-valeur.

HashMap<Integer,Integer> hm = new HashMap<Integer, Integer>();
/*
 *     Logic to put the Key,Value pair in your HashMap hm
 */

// Print the key value pair in one line.
hm.forEach((k,v) -> System.out.println("key: "+k+" value:"+v));

Voici un exemple d'utilisation d'une expression Lambda :

    HashMap<Integer,Integer> hm = new HashMap<Integer, Integer>();
    Random Rand = new Random(47);
    int i=0;
    while(i<5){
        i++;
        int key = Rand.nextInt(20);
        int value = Rand.nextInt(50);
        System.out.println("Inserting key: "+key+" Value: "+value);
        Integer imap =hm.put(key,value);
        if( imap == null){
            System.out.println("Inserted");
        }
        else{
            System.out.println("Replaced with "+imap);
        }               
    }

    hm.forEach((k,v) -> System.out.println("key: "+k+" value:"+v));

Output:

Inserting key: 18 Value: 5
Inserted
Inserting key: 13 Value: 11
Inserted
Inserting key: 1 Value: 29
Inserted
Inserting key: 8 Value: 0
Inserted
Inserting key: 2 Value: 7
Inserted
key: 1 value:29
key: 18 value:5
key: 2 value:7
key: 8 value:0
key: 13 value:11

Aussi on peut utiliser Spliterator pour le même.

Spliterator sit = hm.entrySet().spliterator();

UPDATE


Y compris les liens vers la documentation Oracle Docs. Pour plus sur Lambda , allez à this lien et devez lire Opérations d'agrégat et pour Spliterator, allez à ceci lien .

219
Nitin Mahesh

Map.values():

HashMap<String, HashMap<SomeInnerKeyType, String>> selects =
    new HashMap<String, HashMap<SomeInnerKeyType, String>>();

...

for(HashMap<SomeInnerKeyType, String> h : selects.values())
{
   ComboBox cb = new ComboBox();
   for(String s : h.values())
   {
      cb.items.add(s);
   }
}
50
Bert F

Vous pouvez effectuer une itération sur une HashMap (et de nombreuses autres collections) à l'aide d'un itérateur, par exemple:

HashMap<T,U> map = new HashMap<T,U>();

...

Iterator it = map.values().iterator();

while (it.hasNext()) {
    System.out.println(it.next());
}
18

Flux Java 8

Avec la méthode forEach qui accepte une expression lambda , nous avons également flux API, dans Java 8.

Itérer sur les entrées (Utilisation de forEach et de Streams):

sample.forEach((k,v) -> System.out.println(k + "=" + v)); 
sample.entrySet().stream().forEachOrdered((entry) -> {
            Object currentKey = entry.getKey();
            Object currentValue = entry.getValue();
            System.out.println(currentKey + "=" + currentValue);
        });
sample.entrySet().parallelStream().forEach((entry) -> {
            Object currentKey = entry.getKey();
            Object currentValue = entry.getValue();
            System.out.println(currentKey + "=" + currentValue);
        });

L’avantage des flux est qu’ils peuvent être facilement parallélisés et peuvent être utiles lorsque nous disposons de plusieurs processeurs. Nous devons simplement utiliser parallelStream() à la place de stream() ci-dessus. Avec les flux parallèles, il est plus logique d'utiliser forEach, car forEachOrdered ne ferait aucune différence en termes de performances. Si nous voulons parcourir les touches, nous pouvons utiliser sample.keySet() et pour les valeurs sample.values().

Pourquoi forEachOrdered et non forEach avec des flux?

Les flux fournissent également la méthode forEach mais le comportement de forEach est explicitement non déterministe, où, comme le forEachOrdered exécute une action pour chaque élément de ce flux, dans ordre de rencontre du flux si le flux a un ordre de rencontre défini. Donc, forEach ne garantit pas que la commande sera conservée. Vérifiez également this pour plus.

16
i_am_zero

Je fais généralement la même chose que cx42net, mais je ne crée pas explicitement d'entrée.

HashMap<String, HashMap> selects = new HashMap<String, HashMap>();
for (String key : selects.keySet())
{
    HashMap<innerKey, String> boxHolder = selects.get(key);
    ComboBox cb = new ComboBox();
    for (InnerKey innerKey : boxHolder.keySet())
    {
        cb.items.add(boxHolder.get(innerKey));
    }
}

Cela me semble le plus intuitif, je pense que je suis prévenu contre les itérations sur les valeurs d’une carte.

15
panahi

Utilisez entrySet,

/**
 *Output: 
D: 99.22
A: 3434.34
C: 1378.0
B: 123.22
E: -19.08

B's new balance: 1123.22
 */

import Java.util.HashMap;
import Java.util.Map;
import Java.util.Set;

public class MainClass {
  public static void main(String args[]) {

    HashMap<String, Double> hm = new HashMap<String, Double>();

    hm.put("A", new Double(3434.34));
    hm.put("B", new Double(123.22));
    hm.put("C", new Double(1378.00));
    hm.put("D", new Double(99.22));
    hm.put("E", new Double(-19.08));

    Set<Map.Entry<String, Double>> set = hm.entrySet();

    for (Map.Entry<String, Double> me : set) {
      System.out.print(me.getKey() + ": ");
      System.out.println(me.getValue());
    }

    System.out.println();

    double balance = hm.get("B");
    hm.put("B", balance + 1000);

    System.out.println("B's new balance: " + hm.get("B"));
  }
}

voir exemple complet ici:

4
icyrock.com