TreeMap ведет себя ненормально

#java

#java

Вопрос:

 import java.util.*;    
public class Test {
        public static void main(String[] args) {

            Map<String,String> map = new TreeMap<String,String>();
            map.put("10", "America");
            map.put("1", "Australia");
            map.put("2", "India");
            map.put("11", "China");

            System.out.println(map);

        }
    }
  

При запуске приведенного выше фрагмента кода в консоли я получаю вывод в виде :

{1=Australia, 10=America, 11=China, 2=India}

Но я ожидаю вывода в виде

{1=Australia, 2=India, 10=America, 11=China}

Но при изменении логики, как указано ниже, внутри вышеупомянутого main ()

  Map<String,String> map = new TreeMap<String,String>();
        map.put("US", "America");
        map.put("AUS", "Australia");
        map.put("IN", "India");
        map.put("CH", "China");

    System.out.println(map);
  

Я получаю желаемый результат

({AUS=Australia, CH=China, IN=India, US=America})

Насколько я понимаю, метод entrySet() TreeMap возвращает заданный вид отображений, содержащихся на карте. Итератор набора возвращает сопоставления в порядке возрастания ключей. Итак, почему это происходит в первом случае?

Любое предложение высоко ценится.

Комментарии:

1. название потрясающее. почти так же полезно, как: ‘treemap не работает’

2. Извините, нет ничего настолько серьезного

Ответ №1:

Потому что "10" является лексикографически меньшим, чем "2" .


Вот подсказка:

 Map<Integer,String> map = new TreeMap<Integer,String>();
map.put(10, "America");
map.put(1, "Australia");
map.put(2, "India");
map.put(11, "China");

System.out.println(map);
// {1=Australia, 2=India, 10=America, 11=China}
  

Вот еще одна подсказка: String#compareTo(String) vs Integer#compareTo(Integer) .


Не могли бы вы, пожалуйста, объяснить, что на самом деле вы подразумеваете под «’10’ лексикографически меньше, чем ‘2’».

Сначала прочитайте JavaDoc, на который я ссылался, особенно первую ссылку.

Теперь давайте рассмотрим несколько простых сравнений строк:

  • «a», очевидно, предшествует «b»
  • аналогично «b» стоит перед «z»

Не должно быть большой натяжкой распространить это на числовые символы:

  • «0» предшествует «1»
  • «1» предшествует «9»

Порядок расположения отдельных символов, таких как a , b , z , 0 , 1 9 , и , называется их, ,лексикографическим порядком,,,. Короче говоря, каждый символ имеет числовое представление, которое вас не сильно удивит.

Теперь давайте рассмотрим несколько более сложных сравнений строк:

  • «aa» предшествует «bb» (это не должно быть большим сюрпризом)
  • «aa» также предшествует «ab»

Как мы определили второй случай? Символ за символом.

 1. "a" is the same character as "a", so we need to keep going
2. "a" comes before "b", so we're done.
  

Еще один пример: «ba» стоит перед «c», поскольку «b» стоит перед «c».

Давайте сделаем то же самое для строк, содержащих числовые символы:

  • Стоит ли «2» перед «10»? Мы сравниваем посимвольно:

    1. Стоит ли «2» перед «1»? Нет, это происходит после, так что мы уже закончили.

Комментарии:

1. Не могли бы вы, пожалуйста, объяснить, что на самом деле вы подразумеваете под «’10’ лексикографически меньше, чем ‘2’».

2. Прочитайте связанные JavaDocs, пока я что-то печатаю.

3. «10» меньше, чем «2», точно так же, как «BA» меньше, чем «C». В вашем случае «1» в «10» меньше, чем «2».

4. Привет, Мэтт, это не тот ответ, который я ожидал. Я знал, что на самом деле основным фактом является то, что метод compareTo String сравнивает строки лексикографически, поскольку я не мог понять значение лексикографически, я загрузил этот вопрос.

5. Смотрите мою правку. Это немного многословно, но, надеюсь, понятно.