Java TreeMap (comparator) und get-Methode ignoriert den Komparator
public final Comparator<String> ID_IGN_CASE_COMP = new Comparator<String>() {
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
}
};
private Map< String, Animal > _animals = new TreeMap< String, Animal >(ID_IGN_CASE_COMP);
Mein problem ist, wie mit der Methode get(id) ignorieren den Komparator gegeben. Ich möchte die Karte zu sein, um von groß-und Kleinschreibung aber ich will, dass es groß-und Kleinschreibung werden, wenn ich das abrufen der Werte, indem Sie einen bestimmten Schlüssel.
- Wie soll das überhaupt funktionieren? Die TreeMap würde müssen repräsentieren zwei unterschiedliche Ordnungen. Es kann dies nicht tun.
- kurze Bemerkung: Sie müssen nicht zum erstellen dieser Komparator<String> es ist bereits in der java.lang.Die String-Klasse : String.CASE_INSENSITIVE_ORDER
- Ich sehe nicht das problem. Es wird der Wert von der Zeichenkette " key Case-Sensitiv.
- Dank pierre, das hilft 🙂
- Ist es nicht möglich, durch überschreiben der Methode get?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, die Antwort ist einfach. Umsetzung Ihrer eigenen Komparator, der einen mit groß-und Kleinschreibung Sortieren, aber nicht NICHT geben 0 zurück für "Ein" und "eine"... Art Sie auch sein.
Das Problem ist, dass Ihr comparator 0 zurück für die compare( "A", "A" ) den Fall, das heißt, es ist der gleiche Schlüssel wie weit die Karte geht.
Verwenden Sie einen Komparator wie:
Dann alle Tasten gehen, unabhängig von Fall und "a" und "a" wird immer noch sortiert werden, zusammen.
In anderen Worten, get("a") geben Sie einen anderen Wert aus get("A")... und Sie beide zeigen, bis in keySet() Iteratoren. Sie werden nur zusammen sortiert.
In einer TreeMap, indem zwei Tasten a und b (in dieser Reihenfolge), so dass compare(a, b) gibt 0 zurück führen, dass der neueste Eintrag Hinzugefügt (b) überschreibt die erste (a).
In Ihrem Fall bedeutet dies, dass es nie mehr eine Verwendung für die groß-und Kleinschreibung get(id).
zitieren http://java.sun.com/javase/6/docs/api/java/util/TreeMap.html
Dies ist wahrscheinlich nicht das, was Sie wollen.
Wenn die Karte ist vergleichsweise klein und Sie brauchen nicht zu Holen, die sortierten Einträge, sehr viele Male, eine Lösung ist die Verwendung einer HashMap (oder eine TreeMap ohne das explizite setzen der Komparator), und Sortieren Sie die Einträge, Fall-vor allem, wenn Sie Sie brauchen, bestellt.
Müssen Sie zwei separate TreeMaps für, dass mit dem gleichen Inhalt, aber unterschiedlichen Komparatoren.
vielleicht wird das den job tun:
benötigen Sie eine multimap: jeder Eintrag dieser multimap hält die groß-und Kleinschreibung Tasten und aanother Karte mit dem original-Schlüssel als Wert.
Gibt es viele frei verwendbare Implementierungen von multimaps wie Sammlungen, Google Collections, etc
Zusätzlich zu all den anderen Antworten und Zustimmen, dass es unmöglich ist, ein einzelnes TreeMap-Struktur mit unterschiedlichen Komparatoren:
Ihrer Frage verstehe ich, dass Sie zwei Anforderungen: das Datenmodell wird groß - /Kleinschreibung (Sie wollen den case sensitive Werte, wenn Sie
get()
), der Moderator ist der groß-und Kleinschreibung (Sie wollen einen case sensitive bestellen, die Präsentation ist nur eine Annahme).Nehmen wir an, wir füllen die Karte mit den Zuordnungen (aa,obj1), (aA,obj2), (Aa,obj3), (AA,obj4). Der iterator wird, stellt die Werte in der Reihenfolge: (obj4, obj3, obj2, obj1)(*). Jetzt in welcher Reihenfolge tun Sie erwarten, wenn sich die Karte wurde bestellt, der groß-und Kleinschreibung? Alle vier Tasten wäre gleich und die Reihenfolge undefiniert. Oder sind Sie auf der Suche nach einer Lösung, wie lösen die Sammlung {obj1, obj2, obj3, obj4} für die Taste 'AA'? Aber das ist ein anderer Ansatz.
SO ermutigt die Gemeinde, um ehrlich zu sein: daher mein Rat an dieser Stelle ist der Blick auf Ihre Anforderung wieder 🙂
(*) nicht getestet, wird davon ausgegangen, dass 'A' < 'a' = true.
Verwenden floorEntry und dann higherEntry in einer Schleife Einträge zu finden, Fall-unempfindlich; stoppen, wenn Sie den genauen Schlüssel übereinstimmen.