Mit einem TreeMap
ist es trivial, eine benutzerdefinierte Comparator
bereitzustellen, wodurch die Semantik von Comparable
Objekten, die der Karte hinzugefügt werden, überschrieben wird. HashMap
s kann jedoch nicht auf diese Weise gesteuert werden; Die Funktionen, die Hash-Werte und Gleichheitsprüfungen bereitstellen, können nicht "seitengeladen" werden.Warum darf eine externe Schnittstelle nicht HashCode/Equals für eine HashMap bereitstellen?
Ich vermute, es wäre sowohl einfach als auch nützlich, eine Schnittstelle zu entwerfen und diese in HashMap
(oder eine neue Klasse) nachzurüsten? So etwas wie dies, außer mit besseren Namen:
interface Hasharator<T> {
int alternativeHashCode(T t);
boolean alternativeEquals(T t1, T t2);
}
class HasharatorMap<K, V> {
HasharatorMap(Hasharator<? super K> hasharator) { ... }
}
class HasharatorSet<T> {
HasharatorSet(Hasharator<? super T> hasharator) { ... }
}
Das case insensitive Map
Problem bekommt eine triviale Lösung:
new HasharatorMap(String.CASE_INSENSITIVE_EQUALITY);
Wäre dies machbar, oder können Sie sehen, alle grundlegenden Probleme mit diesem Ansatz?
Wird der Ansatz in vorhandenen (nicht JRE) Bibliotheken verwendet? (. Versuchte google, kein Glück)
EDIT: Nice Abhilfe durch hazzen vorgestellt, aber ich fürchte, das ist das Problem zu umgehen Ich versuche, ... zu vermeiden;)
EDIT: Changed Titel nicht längere Erwähnung "Komparator"; Ich vermute, das war ein bisschen verwirrend.
EDIT: Akzeptierte Antwort in Bezug auf die Leistung; würde eine spezifischere Antwort lieben!
EDIT: Es gibt eine Implementierung; Sehen Sie die akzeptierte Antwort unten.
EDIT: Umformuliert den ersten Satz, um deutlicher zu zeigen, dass es die Seitenladung ist, nach der ich bin (und nicht bestellen; Bestellung gehört nicht in HashMap).
"Diese Klasse gibt keine Garantie für die Reihenfolge der Karte, insbesondere garantiert sie nicht, dass die Bestellung im Laufe der Zeit konstant bleibt." - HashMaps Javadocs. Mit anderen Worten, HashMap ist nicht geordnet. – Powerlord
Diese Anweisung ermöglicht die Verwendung einer beliebigen hashCode-Implementierung und ermöglicht es der Map, die Größe selbst zu ändern. Das ist also ein Feature und kein Problem in diesem Zusammenhang? – volley