2008-12-03 8 views
5

Dies sollte für viele von Ihnen einfach sein, aber für mich ist es nur ein weiterer Rost, der weggeschnitten werden muss, wenn ich wieder in die grundlegende Java-Programmierung komme. Die Verwendung blutig assoziativer Arrays für so lange Zeit in anderen Sprachen hat mich nett und verwöhnt gemacht. : PDatenstruktur-Auffrischung (Java)

Mein Problem ist einfach: Ich speichere eine Reihe von Objekten, die jeweils eine Zeichenfolge und eine Zahl enthalten, in einer Liste. Ich möchte, dass jedes Objekt, das in diese Liste eingefügt wird, alphabetisch nach seiner Zeichenfolge sortiert wird. Ich möchte auch Objekte aus der Liste nach ihrem String abrufen können. Ich möchte dies so formell und/oder effizient wie möglich tun.

Gibt es dafür schon etwas in den Java-Standardbibliotheken?

+0

Überraschenderweise bieten die Javadocs anständige Informationen über die Verwendung und Leistung der verfügbaren Datenstrukturen. Wenn Sie die Schnittstellen Map, Set und List nachschlagen, werden sie Sie zu den verschiedenen verfügbaren Implementierungen führen. Ich weiß nicht, welche Version Sie verwenden, also habe ich nicht direkt verlinkt. –

Antwort

8

gibt es eine große writeup on java collections, die die meisten Ihrer Bedürfnisse abdeckt.

Kurzer Hinweis dazu: Verwenden Sie einen TreeMap (Komparator c) mit einem benutzerdefinierten Komparator. Schlüssel sind der String, Wert ist das zusammengesetzte Objekt mit String und Anzahl

+0

Danke für deinen Link zu den Java Collections. Ich habe etwas in Java gesucht, das mit Strostrups Beschreibung der C++ - STL vergleichbar ist, und das sieht so aus, als ob es das wäre. – Rich

3

Das klingt wie ein SortedMap. Mit dem String als Schlüssel und der Zahl als Wert.

+0

Ah ok. Vielen Dank. Das war einfacher als ich erwartet hatte. –

+0

Es scheint SortedMap eine Schnittstelle, die übrigens implementiert werden muss (was TreeMap zu tun scheint). –

2

Abgesehen von der SortedMap, könnten Sie eine

TreeSet<Pair<String, Number>>
haben, wo Sie den Komparator liefern, um die Paare zu sortieren (oder machen Sie Ihre Pair-Klasse vergleichbar implementieren und tun Sie es dort).

Dies hält die Objekte aus der Datenstruktur zu trennen, und während für ein triviales Beispiel so ist es keine große Sache, können Sie sich vorstellen, dass ein TreeSet <MyObject> wo MyObject Vergleichbare implementiert ist einfacher in der langen grok Begriff.

+0

Ich denke, es lohnt sich, einige Tests zu schreiben, eh, jetzt haben Sie SortedMap, TreeSet und TreeMap Vorschläge! Ich denke, der TreeXYZ wird schneller sein, um einen Iterator zu bekommen, die Karten schneller zum Einfügen/Abrufen. Vielleicht ist TreeMap also die beste Option überhaupt. – JeeBee

+0

Ich kann das tun, nachdem ich mit dem Lesen fertig bin. Vielen Dank. –

+0

@JeeBee: TreeMap ist die einzige Map, die die Schnittstelle "SortedMap" in der Java-Standard-API implementiert. – Powerlord

1

Wenn Sie zu den Objekten in der Liste doppelten String-Wert haben, können Sie bei Google Collections' TreeMultimap suchen. Mit TreeMultimap werden nicht nur die Schlüssel sortiert, sondern alle Werte mit demselben Schlüssel werden auch in einer Sammlung gespeichert.

Multimap<String, Pair> mm = new TreeMultimap<String, Pair>(
     new Comparator<String>(){...}, 
     new PairComparator()); 
mm.put("A", new Pair("A", 1)); 
mm.put("B", new Pair("B", 2)); 
mm.put("B", new Pair("B", 3)); 
Collection values = mm.values(); 
    // values are [Pair("A", 1), Pair("B", 2), Pair("B", 3)] 
Collection bValues = mm.get("B"); 
    // bValues are [Pair("B", 2), Pair("B", 3)] 
-1

ich etwas ähnliches wie das getan haben, habe ich sie Arraylist Objekte zu speichern und Komparatoren schreiben die Arraylist für die Sortierung.