2017-11-09 5 views
1

Ich habe eine HashMap in meinem Java-Programm, die aus etwa 200-Schlüssel-Wert-Paaren besteht, die sich während der Laufzeit nicht ändern werden, und ich suche nach einer guten Möglichkeit, alle Paare zu initialisieren. Zur Zeit habe ich eine hartcodierte Methode wie folgtAlternative Wege zum Hard-Coding Karte in Java?

private void initializeHashMap(){ 
    hashMap.put(1, "String1"); 
    hashMap.put(2, "String2"); 
    hashMap.put(3, "String3"); 
...} 

für alle 200 Paare. Ist das wirklich eine gute Übung oder gibt es einen anderen, besseren Weg, um die Daten einer anderen Klasse oder einer externen Datei zu lesen?

+0

die Daten aus einer Konfigurationsdatei lesen wäre eine bessere Praxis, da Sie den Inhalt der Karte zu ändern, wären in der Lage, ohne den Code zu ändern. – Eran

+0

Wenn Ihre Map tatsächlich aus dem Schlüssel = 1, Wert-String1, Schlüssel = 2, Wert = String2 besteht, handelt es sich um einen einfachen Fall von Schleifen. Sonst würde ich empfehlen, eine Eigenschaftendatei zu verwenden, um diese Schlüsselwertpaare zu behalten und Eigenschaften zu verwenden, um die Karte zu lesen und zu erstellen –

+0

@akshayapandey Müssen keine Karte daraus erstellen. Eigenschaften ist eine Implementierung von Map. –

Antwort

4

Dies ist der perfekte Anwendungsfall, um eine properties Datei zu betrachten. Wenn Sie die Datei lesen, erhalten Sie eine praktische Karte, mit der Sie spielen können.

1

Eine Alternative, die schlechter in Bezug auf die Lesbarkeit, aber besser in Bezug auf die Präzision ist (die ich in persönlichen Projekten verwende, aber in Teamarbeit vermeiden), wäre die Verwendung einer anonymen Klasse, die ihre Schlüssel/Werte definiert:

Map<Integer,String> myMap = new HashMap<Integer,String>(){{ 
    this.put(1, "String1"); 
    this.put(2, "String2"); 
}}; 

Jetzt bist du kein HashMap mehr Instanziieren sondern eine anonyme Klasse, die sie erweitert. Die Definition dieser anonymen Klasse enthält einen Instanzinitialisierungsblock, der nach dem Konstruktor ausgeführt wird und den/die gewünschten Schlüssel/Werte einrichtet.

0

Ich finde die Verwendung von Streaming eines hartcodierten Array kann eine ziemlich saubere Methode sein.

String[] contents = new String[] { 
     "1:String1", 
     "2:String2", 
     "3:String3" 
}; 
Map<Integer,String> hashMap = Arrays.stream(contents) 
     .collect(Collectors.toMap(
       // Key. 
       s -> Integer.valueOf(s.split(":")[0]), 
       // Value. 
       s -> s.split(":")[1] 
     )); 

Die Datenliste ist viel einfacher zu warten und Sie können es oft halten aus einer Tabelle zum Beispiel auf den neusten Stand.

+0

Ich bin mir bewusst, dass OP nicht nach der Leistung sucht, aber das ist einfach übertrieben wie 2 mal den gleichen Wert usw. teilen und anfällig für Fehler. Ich hoffe, niemand nimmt diese Antwort auf ihre Lösungen an. – Gunhan

+0

@Gunhan Der Split ist nicht der Punkt - es ist das Streaming eines Arrays in die 'Map', die ich vermitteln wollte. – OldCurmudgeon

0

Sie können die Eigenschaftendatei betrachten, da sie die Karte zurückgibt und für die Konfiguration und das Testen hilfreich ist.

Wenn Sie daran interessiert sind eine eigene Klasse für das gleiche halten, dann können Sie mit dem Instanzblock vorangehen,

public Class Data{ 
     private static class MyMap extends HashMap<Integer, String>{ 
      private static final long serialVersionUID=1l; 
      private MyMap(){ 
       this.put(1,"string1"); 
       this.put(2,"string2"); 
       this.put(3,"string3"); 
       this.put(4,"string4"); 
     } 
     } 
    public static final Map<Integer, String> fixedData=Collections.unmodifiable(new MyMap()); 
} 

Dann in Ihrer Klasse können Sie dies als unten.

Class YourClass{ 
    private static final Map<Integer, String> map; 
     static{ 
     map=Data.fixedData; 
     } 

    public final String getValue(final int key){ 
     return map.containsKey(key) ? map.get(key) : ""; 

    } 
}