Java >> Java tutorial >  >> Tag >> break

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.


Java tag