2012-09-07 8 views
6

Ich habe eine Sammlung von großen Anzahl der Objekte, die durch Name/Wert-Paare definiert sind. Ich brauche schnellen Zugriff auf alle ihre Werte und in der Lage, sie alphabetisch sortiert nach Namen zurückgeben. Zuerst dachte ich, ich könnte eine HashMap verwenden, um schnell darauf zugreifen zu können. Aber es gab mir keine Bestellung. Ich habe mich entschieden, zu LinkedHashSet zu wechseln. Das Problem damit ist, dass ich einfügen kann neue Objekte an den richtigen Stellen der Liste, aber LinkedHashSet erlaubt das nicht. Ich muss auch auf Objekte sowohl über ihren Index als auch über ihren Namen zugreifen können.

Wir danken für jede Idee.Wie behalte ich ein Hashset alphabetisch sortiert?

+1

Haben Sie versucht, 'TreeMap'? – Santosh

Antwort

11

können Sie TreeMap

Ein Rot-Schwarz-Baum basiert NavigableMap Implementierung verwenden. Die Map wird nach der natürlichen Reihenfolge ihrer Schlüssel sortiert, oder nach einem Komparator, der bei der Erstellung der Map zur Verfügung gestellt wird, abhängig davon, welcher Konstruktor verwendet wird.

+0

Sieht so aus, als ob ich das brauche. Vielen Dank. – svz

+0

Dies ist die falsche Antwort. Eine TreeMap garantiert keine Singularität wie das Set. Verwenden Sie stattdessen ein TreeSet – checklist

+0

Hinweis: doppelte Objekte sind in TreeSet nicht erlaubt, aber in TreeMap zulässig. – Yuci

0

Ich würde ein TreeSet verwenden, das ein SortedSet ist. Sie müssen Ihre benutzerdefinierte Klasse basierend auf dem Namen als Vergleichbar definieren, und Ihre Sammlung wird immer sortiert.

Hinweis: Sortierte Sammlungen haben eine Zugriffszeit von O (log N).

0

Haben Sie sich TreeMap angesehen? Es basiert auf Rot-Schwarz-Bäumen, die helfen, die Bestellung aufrecht zu erhalten, aber dennoch einen schnellen Zugriff ermöglichen.

14

Warum nicht versuchen TreeSet. Erlaubt Ihre Liste keine Duplikate? Wenn ja, dann sollte das Set in Ordnung sein. Wie Sie Strings hinzufügen und diese implementiert den Satz Komparator wird automatisch für Sie

sortiert werden, wenn Sie hatten

Set<String> s = new TreeSet<String>(); 
s.add("B"); 
s.add("C"); 
s.add("A"); 

dann wäre der Inhalt des Satzes A, B, C

0

A TreeMap sollte Ihren Anforderungen entsprechen. Wenn Ihre Schlüssel keine Literale sind, verwenden Sie den entsprechenden Comparator im TreeMap-Konstruktor.

0

Sie können Comparator verwenden ..

Collections.sort(yourCollection, new Comparator() { 

    public int compare(YourObject o1, YourObject o2) { 
     // put Comparesion according to your requirement 
     return AnyObject; 
    } 
});