2009-07-15 4 views
1

Welche Generics Collection-Klasse kann ich verwenden, die sowohl Mapping-und Array-ähnliche Funktionalität bietet. Ich möchte beispielsweise einen String einem Double zuordnen und den Wert mithilfe des Schlüssels als Index referenzieren.Java - Collection Selection

collection[key] = collection[key] + double 

Bietet die Google Collection-Bibliothek eine solche Funktionalität?

Danke.

Antwort

2

Java wird nicht zulassen, dass Sie die Halterung Syntax mit Sammlungen verwenden, aber man konnte so etwas wie:

HashMap<String, Double> collection = new HashMap<String, Double>(); 

String key = "some key"; 
... 

if(collection.containsKey(key)) 
{ 
    // increment the value 
    collection.put(key, collection.get(key) + 1.0); 
} 
else 
{ 
    // initialize the value 
    collection.put(key, 0.0); 
} 
+0

(Wenn jemand dies in einem Jahr liest, könnte JDK7 die '[]' Syntax für Sammlungen haben.) –

+0

Danke Tom, ich wusste nicht, dass das geplant war. Hoffentlich wird mich jemand darauf anpingen, wenn ich vergesse, darauf zurückzukommen, wenn Java 7 herauskommt. –

1

I java.util.HashMap verwenden für Schlüssel-Wert-Paare, es sei denn die Leistung ist ein Problem, das es fast immer nicht ist. :-) Entweder Ihr Schlüssel

+0

HashMap ist über die performante, was Sie gegen direkte Lookups kommen werden. Adds können etwas langsamer als eine verknüpfte Liste sein. Wenn Sie nicht stark an den Speicher gebunden sind, werden Sie keinen Hash für die Leistung in einer Nachschlage-Situation außer einem Index in einem Array oder ArrayList schlagen. –

2

Sie Art von hier zu wählen haben, ist ein String:

Map<String, Double> myMap = new HashMap<String, Double>(); 
myMap.put("key1", 5.0); // caution - auto-wrap 
myMap.put("key1", myMap.get("key1") + 5.0); // caution - auto-wrap 

oder es ist ein int:

double[] myArray = new double[size]; 
int key1 = 1; 
myArray[key1] = 5.0; 
myArray[key1] += 5.0; 
1

Ich sehe nicht, wie Ihr Beispiel Array verwendet ähnliche Funktionalität. Wollen Sie nur den Array-Indexoperator überladen? Wenn dies der Fall ist, sollten Sie wissen, dass Java das Überladen von Operatoren nicht zulässt.

Wenn Sie wirklich Array-Operationen benötigen, können Sie mit der LinkedHashMap Schlüsselwert-Lookups durchführen und eine Reihenfolge innerhalb der Werte verfolgen. Dies ist in erster Linie nützlich zum Erstellen eines LRU-Caches.

+0

Ich war im C# -Modus. Array-Index-Operator ist genau das, woran ich dachte. – javacavaj

0

Ja, ich wollte eine Weile zurück, das Gleiche tun, wo ich darstellen wollte Datenbanktabelle in einer Datenstruktur, in der sich eine Primärschlüssel- "Lookup" -Spalte befand. HashMap würde das nicht alleine tun (soweit ich weiß).

Ich denke, was ich tat, war meine eigene Datenstruktur Klasse, die mehrere Arrays durch einen Indexwert zugeordnet. Ich nehme an, ich hätte eine RowData-Klasse erstellen und jede rowdata in einer HashMap speichern können. Hmm.

jemand anderes könnte wahrscheinlich viel besser als ich erklären. Ich bin nur ein Anfänger.

1

Die nächste, die ich sehen kann, ist LinkedHashMap, die Ihnen vorhersehbare Reihenfolge der Elemente gibt, aber das gibt Ihnen keine schnelle Suche eines bestimmten Index (es ist eine Art wie LinkedList auf diese Weise). Und es gibt Ihnen keine spezifische Methode, nach einem bestimmten Index zu suchen, Sie müssten Ihren eigenen hinzufügen.

+0

Ja, diese Antwort ist das Ticket. Hier ein Beispiel: http://www.java-examples.com/simple-java-linkedhashmap-example – djangofan

0

Meinst du array-ähnliche Funktionalität oder Array-artige Syntax. Java erlaubt keine Arrays, array-ähnliche Syntax zu verwenden, aber alle Auflistungen verfügen über eine arrayähnliche Funktionalität.

Wenn Sie meinen, dass Sie Paare (Schlüssel/Wert) speichern UND auf sie mit einem Index zugreifen möchten (wie Sie ein Array), dann gibt es eine "LinkedHashMap" Sammlung mit Ihrem Namen darauf.

Wenn Sie meinen, dass Sie in beide Richtungen indizieren möchten (beide Seiten der Sammlung könnten ein Schlüssel sein), möchten Sie wahrscheinlich Ihre eigene Sammlung mit zwei Hash-Maps erstellen und jedes Mal, wenn ein Objekt Ihrer Sammlung hinzugefügt wird , fügen Sie es zu beiden Karten hinzu.