Komparator, der skelner mellem store og små bogstaver, bryder mit TreeMap
Det sker fordi TreeMap
betragter elementer som lig, hvis a.compareTo(b) == 0
. Det er dokumenteret i JavaDoc til TreeMap (betonet min):
Bemærk, at rækkefølgen, der vedligeholdes af et trækort, ligesom ethvert sorteret kort, og uanset om der er angivet en eksplicit komparator eller ej, skal være i overensstemmelse med equals
hvis dette sorterede kort skal implementere kortgrænsefladen korrekt. (Se Comparable
eller Comparator
for en præcis definition af i overensstemmelse med equals
.) Dette skyldes, at kortgrænsefladen er defineret i forhold til equals
operation, men et sorteret kort udfører alle nøglesammenligninger ved hjælp af dets compareTo
(eller compare
) metode, så to nøgler, der anses for at være lige ved denne metode er , fra det sorterede korts synspunkt, lige . Opførselen af et sorteret kort er veldefineret, selvom dets rækkefølge er inkonsistent med equals
; det undlader bare at overholde den generelle kontrakt for kortgrænsefladen.
Din komparator er ikke i overensstemmelse med ligeværdige.
Hvis du ønsker at beholde ikke-lige-men-lige-ignorerende-små og store bogstaver, skal du indsætte et andet kontrolniveau i din komparator for at bruge store og små bogstaver:
public int compare(String o1, String o2) {
int cmp = o1.compareToIgnoreCase(o2);
if (cmp != 0) return cmp;
return o1.compareTo(o2);
}
Comparator
du går videre til en TreeMap
bestemmer ikke kun rækkefølgen af nøglerne inde i Map
, bestemmer den også, om to nøgler betragtes som identiske (de anses for at være identiske, når compare()
returnerer 0
).
Derfor, i din TreeMap
, "abc" og "ABC" betragtes som identiske nøgler. Map
s tillader ikke identiske nøgler, så den anden værdi Element2
overskriver den første værdi Element1
.
Du skal sikre dig, at ligheden af kortets elementer stemmer overens med komparatoren. Citerer fra klassens kommentar:
Bemærk, at rækkefølgen, der vedligeholdes af et trækort, ligesom ethvert sorteret kort, og uanset om der er angivet en eksplicit komparator eller ej, skal være i overensstemmelse med lig, hvis dette sorterede kort skal implementere grænsefladen korrekt.