2009-06-22 1 views
8

Ich muss Schlüssel/Wert-Informationen in irgendeiner Art von Sammlung speichern. In C#, würde ich ein Wörterbuch wie folgt definieren:C# Flüchtling sucht ein wenig Java-Sammlungen helfen

var entries = new Dictionary<string, int>(); 
entries.Add("Stop me", 11); 
entries.Add("Feed me", 12); 
entries.Add("Walk me", 13); 

Dann würde ich die Werte zugreifen so:

int value = entries["Stop me"]; 

Wie kann ich tun dies in Java? Ich habe Beispiele mit ArrayList gesehen, aber ich möchte die Lösung mit Generika, wenn möglich.

+1

C# Flüchtling? Ist das nicht ein Zustand der Sünde? :)) –

+0

Mehr wie eine Epiphanie :) – skaffman

+0

ArrayList ist eine Sequenz oder ein listähnliches Konstrukt (kein Wörterbuch), obwohl es generisch ist –

Antwort

22

Sie möchten ein, dass in der letzten Zeile Map

Map<String, Integer> m = new HashMap<String, Integer>(); 
m.put("Stop me", 11); 
Integer i = m.get("Stop me"); // i == 11 

Hinweis verwenden, nach etwas suchen, schaut ich hätte sagen können:

int i = m.get("Stop me"); 

Was ist eine Abkürzung für (mit Java-Auto-Unboxing):

int i = m.get("Stop me").intValue() 

Wenn in der Map bei dem angegebenen Schlüssel kein Wert vorhanden ist, gibt getnull zurück und dieser Ausdruck löst eine NullPointerException aus. Daher ist es immer eine gute Idee, den boxed TypenInteger in diesem Fall

1

Sie wollen auf jeden Fall ein HashMap, zu verwenden, die die Java-Version von C# Dictionary ist.

6

Sie verwenden eine Map in Java.

Beachten Sie, dass int nicht (oder irgendein anderer primitiver Typ) als generischen Typparameter verwenden können, aber wegen der Autoboxing, verhält es sich nach wie vor fast, als ob es ein Map<String, int> war anstelle ein Map<String, Integer>. (Sie wollen nicht viel Autoboxing in erfolgskritischen Code zu tun, though.)

Map<String, Integer> entries = new HashMap<String, Integer>(); 
entries.put("Stop me", 11); 
entries.put("Feed me", 12); 
entries.put("Walk me", 13); 
int value = entries.get("Stop me"); // if you know it exists 
// If you're not sure whether the map contains a value, it's better to do: 
Integer boxedValue = entries.get("Punch me"); 
if (boxedValue != null) { 
    int unboxedValue = boxedValue; 
    ... 
} 
+0

Ihre letzte Zeile ist gefährlich: Wenn es keinen Wert in der Karte an diesem Schlüssel gibt, ist es wird eine NullPointerException wegen Ihrer Verwendung von Unboxing werfen –

+0

Ja, guter Punkt. Autoboxing ist sehr nett, aber Unboxing hilft nicht wirklich viel. –

+0

Roll auf der Annotation @NotNull –

7

ein java.util.Map verwenden. Es gibt mehrere Implementierungen:

  • HashMap: O (1) Lookup, behält nicht die Reihenfolge der Tasten
  • TreeMap: O-Lookup (n log), unterhält der Reihenfolge der Tasten, so dass man über sie in ein laufen kann garantierte Reihenfolge
  • : O (1) Nachschlagen, iteriert über Schlüssel in der Reihenfolge, in der sie zur Karte hinzugefügt wurden.

Sie nutzen sie, wie:

Map<String,Integer> map = new HashMap<String,Integer>(); 
map.put("Stop me", 11); 
map.put("Feed me", 12); 

int value = map.get("Stop me"); 

Für zusätzlichen Komfort mit Sammlungen arbeiten, haben einen Blick auf die Google Collections library. Es ist exzellent.

+0

Wiederholen Sie den Kommentar: Ihre letzte Zeile ist gefährlich: Wenn es keinen Wert in der Karte bei diesem Schlüssel gibt, wird eine NullPointerException wegen Ihrer Verwendung von Unboxing –

+0

+1 für Erläuterungen zu Map-Implementierungen – dfa

+0

Dort werfen ist ein Wert in der Karte mit diesem Schlüssel! Aber um dies zu verdeutlichen, würden Sie zuerst nach einem fehlenden Schlüssel suchen, indem Sie die contains-Methode der Map aufrufen und/oder prüfen, ob das Ergebnis von get (key) nicht null ist. Letzteres ist weniger wahrscheinlich, da es eine schlechte Übung ist, Vermüllung zwischen Objekten zu passieren. – Nat

1
Map<String, Integer> map = new HashMap<String, Integer>(); 
map.put("Stop Me", 11); 
map.put("Feed Me", 12); 
map.put("Walk Me", 13); 
Integer x; // little hack 
int value = (x = a.get("aaa")) == null? 0 : x; 

als Alternative können Sie versuchen Enum:

enum Action { 

    STOP(11), 
    FEED(12), 
    WALK(13); 

    private final int value; 

    private Action(int value) { 
     this.value = value; 
    } 

    public int value() { 
     return value; 
    } 

    public static Action valueOf(int value) { 
     for (Action action : values()) { 
      if (action.value == value) { 
       return action; 
      } 
     } 

     return null; // or a null-object 
    } 
} 

Test:

public void action() { 
    Action action = Action.valueOf("FEED"); 
    // or Action.FEED for more compile-time safety 
    int value = action.value(); 
    // instantiating by code 
    Action walk = Action.valueOf(13); 
} 
+1

Wiederholen Sie den Kommentar: Ihre letzte Zeile ist gefährlich: Wenn es keinen Wert in der Karte an diesem Schlüssel gibt, wird es eine NullPointerException wegen Ihrer Verwendung von Unboxing –

+0

guten Punkt werfen, mit einem Boxed Typ sollte besser sein – dfa

+0

Wir hoffen, der Benutzer hat Namen, die legale Java-Identifikatoren sind. – akarnokd