A Comparator
użyłem w moim TreeMap
zepsułem zachowanie przeznaczone dla tego TreeMap
. Spójrz na poniższy kod:Case-niewrażliwy Komparator łamie moje TreeMap
TreeMap<String, String> treeMap = new TreeMap<>(new Comparator<String>() {
public int compare(String o1, String o2) {
return o1.toLowerCase().compareTo(o2.toLowerCase());
}
});
treeMap.put("abc", "Element1");
treeMap.put("ABC", "Element2");
Co myślę, że zrobili to, że stworzyli mapę, która jest posortowana według swoich kluczy, bez uwzględniania wielkości liter. Dwa różne elementy mają klucze nie równe (abc
i ABC
), których porównanie powróci 0
. Spodziewałem się tylko losowego uporządkowania dwóch elementów. Jednak komenda:
System.out.println("treeMap: " + treeMap);
następująco:
treeMap: {abc=Element2}
Kluczem abc
została ponownie przypisana wartość Element2
!
Czy ktoś może wyjaśnić, jak to się stało i czy jest to prawidłowe, udokumentowane zachowanie TreeMap
?
'Comparator' jest * całkowity porządek *. Co to znaczy, że "abc" i "ABC" znajdują się na twojej mapie? Co jest pierwsze? –
masz swoje zamierzone (jeśli nieoczekiwane) zachowanie; Twój komparator nie rozróżnia wielkości liter, twoja mapa używa tego komparatora - więc jest to również, w dużym stopniu, bez rozróżniania wielkości liter (klucze w.r.t.). * Po prostu wymyśliłeś, jak zrobić mapę, która nie jest wrażliwa na wielkość liter * - dla ciebie, ale nie widzę tutaj nic "szokującego" lub "nielegalnego" ... robi dokładnie to, co ty * powiedziałeś *. – vaxquis
powiązane: [Java TreeMap niestandardowe dziwne zachowanie komparatora] (https://stackoverflow.com/questions/30219835/java-treemap-custom-comparator-weird-behavour) –