Hoe voor elke hashmap? [DUPLICEER]

Ik heb dit veld:

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

Voor elke Hash<String, HashMap>Ik moet een ComboBoxmaken, waarvan de items de waarde zijn (die toevallig een hashmap zelf is) van HashMap <String, **HashMap**>.

Door (niet-functionerende) demonstratie:

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

Antwoord 1, Autoriteit 100%

Ik weet dat ik een beetje laat ben voor die, maar ik zal deel wat ik ook deed, in het geval dat het iemand anders helpt:

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

Antwoord 2, Autoriteit 20%

lambda expressie java 8

In Java 1.8 (Java 8) Dit is veel eenvoudiger geworden door Foreach -methode te gebruiken van geaggregeerde operaties (Stream Operations ) die lijkt op iterators van Itable -interface.

Kopieer gewoon de onderstaande verklaring in uw code en hernoem de Hashmap -variabele van HM naar uw Hashmap-variabele om het hoofd van de sleutelwaarde te printen.

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

Hier is een voorbeeld waar een lambda-expressie wordt gebruikt:

   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

Ook kan men spliterator voor hetzelfde gebruiken.

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

update


inclusief documentatie-links naar Oracle Docs.
Voor meer op Lambda Ga naar deze Link en moet lezen Aggregate Operations en voor spliterator Ga naar deze LINK .


Antwoord 3, Autoriteit 4%

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

Antwoord 4, Autoriteit 2%

Streams Java 8

Samen met forEachMethode die A Lambda-expressie We hebben ook Stream API’s, in Java 8.

itereren over vermeldingen (met behulp van foreach and beken):

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

Het voordeel van streams is dat ze gemakkelijk kunnen worden geparallelliseerd en handig kunnen zijn als we meerdere CPU’s tot onze beschikking hebben. We moeten gewoon parallelStream()gebruiken in plaats van stream()hierboven. Bij parallelle streams is het logischer om forEachte gebruiken, aangezien forEachOrderedgeen verschil in prestaties zou maken. Als we sleutels willen herhalen, kunnen we sample.keySet()gebruiken en voor waarden sample.values().

Waarom forEachOrdereden niet forEachmet streams?

Streams bieden ook de forEach-methode, maar het gedrag van forEachis expliciet niet-deterministisch, waarbij de forEachOrderedeen actie uitvoert voor elk element van deze stream , in de ontmoetingsvolgorde van de streamals de stream een gedefinieerde ontmoetingsvolgorde heeft. Dus forEachgarandeert niet dat de bestelling behouden blijft. Bekijk ook ditvoor meer informatie.


Antwoord 5, autoriteit 2%

Je kunt een HashMap(en vele andere collecties) herhalen met behulp van een iterator, bijvoorbeeld:

HashMap<T,U> map = new HashMap<T,U>();
...
Iterator it = map.values().iterator();
while (it.hasNext()) {
    System.out.println(it.next());
}

Antwoord 6

Ik doe over het algemeen hetzelfde als cx42net, maar ik maak niet expliciet een vermelding.

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

Dit lijkt me gewoon het meest intuïtieve voor mij, ik denk dat ik benadrukbaar ben tegen herhering over de waarden van een kaart.


Antwoord 7

Gebruik 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"));
  }
}

Zie hier:

Other episodes