Alternative Wege für die hart-Codierung-Karte, die in Java?

Bin ich mit einer HashMap in meinem Java-Programm, bestehend aus rund 200 -Schlüssel-Wert-Paare, die sich nicht ändern während der Laufzeit, und ich bin auf der Suche nach einem guten Weg zum initialisieren alle Paare.
Derzeit habe ich eine hartcodierte Methode wie diese

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

für alle die 200 Paare.
Ist das eine gute übung oder gibt es einen anderen, besseren Weg, vielleicht zum Lesen der Daten von einer anderen Klasse oder einer externen Datei?

  • Lesen der Daten aus einer Konfigurationsdatei wäre eine bessere Praxis, denn Sie wäre in der Lage, ändern Sie den Inhalt der Karte ohne änderung des Codes.
  • wenn deine Karte tatsächlich besteht der Schlüssel=1, Wert-string1 , key=2, Wert=string2, es ist ein einfacher Fall von Rekursion. Sonst würde ich vorschlagen, die Verwendung einer properties-Datei, um diese keyvalue-Paare und verwenden Sie die Eigenschaften zu Lesen, die, und erstellen Sie die Karte
  • Brauchen nicht, eine map zu erstellen, aus ihm heraus. Eigenschaften ist eine Implementierung der Map.
  • richtig, aber er erwähnt hashmap in seiner Frage erwähnte ich, dass.
InformationsquelleAutor DocRobson | 2017-11-09

 

4 Replies
  1. 1

    Alternative, das schlimmer ist in Bezug auf die Lesbarkeit, sondern besser in Bezug auf Prägnanz (das werde ich anwenden, persönliche Projekte, vermeiden Sie es aber, im team zu arbeiten) wäre die Verwendung einer anonymen Klasse definiert seine Schlüssel/Werte in der Instanziierungen :

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

    Jetzt bist du nicht instanziieren eines HashMap mehr, sondern eine anonyme Klasse, die Sie erweitert. Diese anonyme Klasse‘ definition enthält ein Instanz-Initialisierer-block, der ausgeführt wird, nachdem der Konstruktor und den gewünschten Schlüssel/Werte.

  2. 0

    Ich finde die mithilfe von streaming-der eine hart-kodierte Arrays werden kann, eine ganz nette Methode.

    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 Daten-Liste ist viel leichter zu pflegen und man kann oft halten Sie es up-to-date aus einer Tabelle zum Beispiel.

    • Ich bin mir bewusst, dass OP sieht nicht nach der Leistung, aber das ist einfach übertrieben wie splitting 2 mal den gleichen Wert usw und anfällig für Fehler. Ich hoffe, niemand nimmt diese Antwort auf Ihre Lösungen.
    • Der split ist nicht der Punkt – es ist das streaming von einem array in das Map dass ich versucht habe, zu vermitteln.
  3. 0

    Können Sie prüfen, Eigenschaften der Datei, wie es wird Sie wieder anzeigen und es hilft für die Konfiguration und das testen.

    Wenn Sie daran interessiert sind, dass eine separate Klasse für die gleichen dann können Sie voran gehen mit der Instanz-block,

       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 Ihre Klasse, die Sie können verwenden Sie diese 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) : "";
    
       }
     }

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.