gleichzeitiges Hinzufügen mehrerer Einträge zu einer HashMap in einer Anweisung

Lesezeit: 5 Minuten

Benutzer-Avatar
Benutzer387184

Ich muss eine konstante HashMap initialisieren und möchte dies in einer einzeiligen Anweisung tun. So vermeiden:

  hashMap.put("One", new Integer(1)); // adding value into HashMap
  hashMap.put("Two", new Integer(2));      
  hashMap.put("Three", new Integer(3));

ähnlich wie bei Ziel C:

[NSDictionary dictionaryWithObjectsAndKeys:
@"w",[NSNumber numberWithInt:1],
@"K",[NSNumber numberWithInt:2],
@"e",[NSNumber numberWithInt:4],
@"z",[NSNumber numberWithInt:5],
@"l",[NSNumber numberWithInt:6],
nil] 

Ich habe kein Beispiel gefunden, das zeigt, wie das geht, nachdem ich mir so viele angesehen habe.

Benutzer-Avatar
Eng.Fouad

Du kannst den … benutzen Doppelte geschweifte Initialisierung Wie nachfolgend dargestellt:

Map<String, Integer> hashMap = new HashMap<String, Integer>()
{{
     put("One", 1);
     put("Two", 2);
     put("Three", 3);
}};

Als Warnung lesen Sie bitte den Thread Efficiency of Java „Double Brace Initialization“ für die Auswirkungen auf die Leistung, die dies haben könnte.

  • @ user387184 Ja, sie nennen es “Doppelklammer-Initialisierer”. Siehe dieses Thema: stackoverflow.com/questions/924285/…

    – Eng.Fouad

    24. November 2011 um 18:39 Uhr

  • Sie sollten diese Methode nicht verwenden. Es erstellt für jedes Mal, wenn Sie es verwenden, eine neue Klasse viel schlechtere Leistung als das einfache Erstellen einer Karte. Siehe stackoverflow.com/questions/924285/…

    – Timo Türschmann

    26. April 2016 um 13:59 Uhr


  • Der Grund, warum ich dies abgelehnt habe, ist, dass es nicht erklärt hat, dass dies für jedes Mal, wenn Sie es verwenden, eine neue Klasse erstellt. Ich denke, dass die Leute sich der Kompromisse bewusst sein sollten, wenn sie es auf diese Weise tun.

    – idungotnosn

    8. November 2016 um 16:28 Uhr

  • @TimoTürschmann Scheint, wenn ich jemals eine statische Initialisierung einer Karte wie dieser benötigen würde, wäre sie auch statisch, wodurch das eliminiert würde jedes Mal, wenn Sie es verwenden Leistungsstrafe – Sie hätten diese Strafe einmal. Ich sehe keine andere Zeit, in der man diese Art der Initialisierung wünschen würde ohne die Variable ist statisch (würde das zB jemals jemand in einer Schleife verwenden?). Ich kann mich aber irren, Programmierer sind erfinderisch.

    – Chris Cirefice

    27. November 2016 um 23:41 Uhr

  • Bitte verwenden Sie dieses Anti-Pattern nicht, es ist aktiv gefährlich und es gibt sinnvolle alternativen.

    – dimo414

    3. April 2018 um 20:59 Uhr

Benutzer-Avatar
Timo Türschmann

Seit Java 9 ist die Nutzung möglich Map.of(...)so:

Map<String, Integer> immutableMap = Map.of("One", 1, 
                                           "Two", 2, 
                                           "Three", 3);

Diese Karte ist unveränderlich. Wenn Sie möchten, dass die Karte veränderbar ist, müssen Sie Folgendes hinzufügen:

Map<String, Integer> hashMap = new HashMap<>(immutableMap);

Wenn Sie Java 9 nicht verwenden können, müssen Sie selbst eine ähnliche Hilfsmethode schreiben oder eine Bibliothek eines Drittanbieters (z Guave), um diese Funktionalität für Sie hinzuzufügen.

  • Nach dem Hinzufügen von 10 Einträgen wird ein seltsamer Fehler “Methode kann nicht aufgelöst werden” ausgegeben. Liegt dieser Fehler bei dieser Methode vor?

    – vikramvi

    2. April 2020 um 7:56 Uhr

  • @vikramvi ja Wenn man sich das anschaut Dokumentation Map.of wird nur bis zu 10 Einträgen gemacht, da es recht mühsam ist

    – fröhlicher

    18. Juni 2020 um 14:45 Uhr

Benutzer-Avatar
JimmyT

Sie können die ImmutableMap von Google Guava verwenden. Dies funktioniert, solange Sie sich nicht darum kümmern, die Karte später zu ändern (Sie können .put() nicht auf der Karte aufrufen, nachdem Sie sie mit dieser Methode erstellt haben):

import com.google.common.collect.ImmutableMap;

// For up to five entries, use .of()
Map<String, Integer> littleMap = ImmutableMap.of(
    "One", Integer.valueOf(1),
    "Two", Integer.valueOf(2),
    "Three", Integer.valueOf(3)
);

// For more than five entries, use .builder()
Map<String, Integer> bigMap = ImmutableMap.<String, Integer>builder()
    .put("One", Integer.valueOf(1))
    .put("Two", Integer.valueOf(2))
    .put("Three", Integer.valueOf(3))
    .put("Four", Integer.valueOf(4))
    .put("Five", Integer.valueOf(5))
    .put("Six", Integer.valueOf(6))
    .build();

Siehe auch: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableMap.html

Eine etwas verwandte Frage: ImmutableMap.of() Workaround für HashMap in Maps?

  • Guava ist riesig, ich würde es nicht für meine Android-App verwenden, es sei denn, es ist absolut notwendig

    – Ericn

    3. Mai 2017 um 7:29 Uhr

  • Hüten Sie sich davor ImmutableMap akzeptiert nicht null Schlüssel oder Werte.

    – Wadzim

    5. Mai 2017 um 17:58 Uhr

  • @Erikn ProGuard können Sie alle Teile einer Bibliothek ausschließen, die Sie nicht verwenden.

    – dimo414

    3. April 2018 um 21:04 Uhr

Benutzer-Avatar
Sadiq Ali

Zu Maps wurden in Java 9 auch Factory-Methoden hinzugefügt. Für bis zu 10 Einträge haben Maps überladene Konstruktoren, die Paare von Schlüsseln und Werten annehmen. Zum Beispiel könnten wir eine Karte verschiedener Städte und ihrer Bevölkerung (laut Google im Oktober 2016) wie folgt erstellen:

Map<String, Integer> cities = Map.of("Brussels", 1_139000, "Cardiff", 341_000);

Der var-args-Fall für Map ist etwas schwieriger, Sie müssen sowohl Schlüssel als auch Werte haben, aber in Java können Methoden nicht zwei var-args-Parameter haben. Der allgemeine Fall wird also behandelt, indem eine var-args-Methode von verwendet wird Map.Entry<K, V> Objekte und Hinzufügen einer statischen entry() Methode, die sie konstruiert. Zum Beispiel:

Map<String, Integer> cities = Map.ofEntries(
    entry("Brussels", 1139000), 
    entry("Cardiff", 341000)
);

Collection-Factory-Methoden in Java 9

Java hat kein Kartenliteral, daher gibt es keine nette Möglichkeit, genau das zu tun, was Sie fragen.

Wenn Sie diese Art von Syntax benötigen, ziehen Sie etwas Groovy in Betracht, das Java-kompatibel ist und Sie Folgendes tun lässt:

def map = [name:"Gromit", likes:"cheese", id:1234]

Benutzer-Avatar
Dakusan

Hier ist eine einfache Klasse, die das erreicht, was Sie wollen

import java.util.HashMap;

public class QuickHash extends HashMap<String,String> {
    public QuickHash(String...KeyValuePairs) {
        super(KeyValuePairs.length/2);
        for(int i=0;i<KeyValuePairs.length;i+=2)
            put(KeyValuePairs[i], KeyValuePairs[i+1]);
    }
}

Und es dann zu benutzen

Map<String, String> Foo=QuickHash(
    "a", "1",
    "b", "2"
);

Dies ergibt {a:1, b:2}

Benutzer-Avatar
Heiße Licks

    boolean x;
    for (x = false, 
        map.put("One", new Integer(1)), 
        map.put("Two", new Integer(2)),      
        map.put("Three", new Integer(3)); x;);

Ignorieren der Deklaration von x (was notwendig ist, um eine “unreachable statement”-Diagnose zu vermeiden), technisch gesehen ist es nur eine Anweisung.

  • Das ist ekelhaft hackig.

    – Micha Treppe

    3. Oktober 2016 um 12:35 Uhr

  • @MicahStairs – Aber es ist nur eine Aussage.

    – Heiße Licks

    3. Oktober 2016 um 12:36 Uhr

  • Stimmt, aber das ist die Art von Code, über die ich in der Produktion nie stolpern würde.

    – Micha Treppe

    3. Oktober 2016 um 12:39 Uhr

  • @MicahStairs – Ich habe Schlimmeres gesehen.

    – Heiße Licks

    3. Oktober 2016 um 13:13 Uhr

  • Omg, ich habe heute danach gesucht, wie funktioniert dieser Code? Ich habe es zum Testen in den Code eingefügt, aber ich kann nicht herausfinden, wie es intern funktioniert … 🙂

    – GOXR3PLUS

    19. Oktober 2016 um 9:50 Uhr

1344940cookie-checkgleichzeitiges Hinzufügen mehrerer Einträge zu einer HashMap in einer Anweisung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy