TreeMap ведет себя ненормально - PullRequest
5 голосов
/ 08 июня 2011
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 Ответ

15 голосов
/ 08 июня 2011

Поскольку "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) против Integer#compareTo(Integer).


Не могли бы вы объяснить, что на самом деле вы подразумеваете под ""10 'лексикографически меньше, чем' 2 '".

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

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

  • «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»?Нет, это приходит после, так что мы уже закончили.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...