it-swarm.com.de

hinzufügen mehrerer Einträge zu einer HashMap auf einmal in einer Anweisung

Ich muss eine Konstante HashMap initialisieren und möchte dies in einer Zeile tun. Etw wie folgt 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 in 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 dies getan wird, nachdem so viele betrachtet wurden.

104
user387184

Du kannst das:

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

Sie können die ImmutableMap von Google Guava verwenden. Dies funktioniert, solange Sie nicht daran interessiert sind, die Map später zu ändern (Sie können .put () nicht auf der Map 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?

54
JimmyT

Seit Java 9 ist es möglich, Map.of(...) zu verwenden:

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

Diese Karte ist unveränderlich. Wenn die Karte veränderbar sein soll, 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 Drittanbieter-Bibliothek (z. B. Guava ) verwenden, um diese Funktionalität für Sie hinzuzufügen.

33

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

Wenn Sie diese Art von Syntax benötigen, sollten Sie Groovy in Betracht ziehen, das Java-kompatibel ist und folgende Möglichkeiten bietet:

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

Hier ist eine einfache Klasse, die 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 dann um es zu benutzen

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

Dies ergibt {a:1, b:2}

6
Dakusan

In Java 9 wurden auch Factory-Methoden hinzugefügt. Für bis zu 10 Einträge wurden Konstruktoren überladen, die Schlüssel- und Wertepaare enthalten. Zum Beispiel könnten wir eine Karte mit verschiedenen Städten 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 Fall var-args für Map ist etwas schwieriger. Sie müssen sowohl Schlüssel als auch Werte haben. In Java können Methoden jedoch nicht über zwei var-args-Parameter verfügen. Der allgemeine Fall wird behandelt, indem Sie eine var-args-Methode von Map.Entry<K, V>-Objekten verwenden und eine statische entry()-Methode hinzufügen, die sie erstellt. Zum Beispiel:

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

Collection Factory-Methoden in Java 9

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

Ignoriert man die Deklaration von x (die notwendig ist, um eine Diagnose "nicht erreichbare Anweisung" zu vermeiden). Technisch gesehen ist dies nur eine Anweisung.

5
Hot Licks

Sie können diese Utility-Funktion zu einer Utility-Klasse hinzufügen:

public static <K, V> Map<K, V> mapOf(Object... keyValues) {
    Map<K, V> map = new HashMap<>();

    for (int index = 0; index < keyValues.length / 2; index++) {
        map.put((K)keyValues[index * 2], (V)keyValues[index * 2 + 1]);
    }

    return map;
}

Map<Integer, String> map1 = YourClass.mapOf(1, "value1", 2, "value2");
Map<String, String> map2 = YourClass.mapOf("key1", "value1", "key2", "value2");

Hinweis: In Java 9 können Sie Map.of verwenden.

1
R. Oosterholt

Ein anderer Ansatz kann das Schreiben einer speziellen Funktion zum Extrahieren aller Elementwerte aus einem String durch regulären Ausdruck sein:

import Java.util.HashMap;
import Java.util.regex.Matcher;
import Java.util.regex.Pattern;

public class Example {
    public static void main (String[] args){
        HashMap<String,Integer> hashMapStringInteger = createHashMapStringIntegerInOneStat("'one' => '1', 'two' => '2' , 'three'=>'3'  ");

        System.out.println(hashMapStringInteger); // {one=1, two=2, three=3}
    }

    private static HashMap<String, Integer> createHashMapStringIntegerInOneStat(String str) {
        HashMap<String, Integer> returnVar = new HashMap<String, Integer>();

        String currentStr = str;
        Pattern pattern1 = Pattern.compile("^\\s*'([^']*)'\\s*=\\s*>\\s*'([^']*)'\\s*,?\\s*(.*)$");

        // Parse all elements in the given string.
        boolean thereIsMore = true;
        while (thereIsMore){
            Matcher matcher = pattern1.matcher(currentStr);
            if (matcher.find()) {
                returnVar.put(matcher.group(1),Integer.valueOf(matcher.group(2)));
                currentStr = matcher.group(3);
            }
            else{
                thereIsMore = false;
            }
        }

        // Validate that all elements in the given string were parsed properly
        if (currentStr.length() > 0){
            System.out.println("WARNING: Problematic string format. given String: " + str);
        }

        return returnVar;
    }
}
0
Uri Ziv