Создайте SortedMap в Java с помощью специального Компаратора

Я хочу создать TreeMap в Java с пользовательским порядком сортировки. Сортированные ключи, которые являются строками, нужно сортировать в соответствии со вторым символом. Значения также являются строками.

Пример карты:

Za,FOO
Ab,Bar

Ответ 1

Вы можете использовать собственный компаратор следующим образом:

    Comparator<String> secondCharComparator = new Comparator<String>() {
        @Override public int compare(String s1, String s2) {
            return s1.substring(1, 2).compareTo(s2.substring(1, 2));
        }           
    };

Пример:

    SortedMap<String,String> map =
        new TreeMap<String,String>(secondCharComparator);
    map.put("Za", "FOO");
    map.put("Ab", "BAR");
    map.put("00", "ZERO");
    System.out.println(map); // prints "{00=ZERO, Za=FOO, Ab=BAR}"

Обратите внимание, что это просто предполагает, что String имеет символ в индексе 1. Он бросает StringIndexOutOfBoundsException, если это не так.


В качестве альтернативы вы также можете использовать это сравнение:

return s1.charAt(1) - s2.charAt(1);

Этот вычитающий "трюк" сломан вообще, но он отлично работает здесь, потому что вычитание двух char не будет переполнять int.

Приведенное выше решение substring и compareTo более читаемо.

См. также:

Ответ 2

Предполагая, что вы не имеете в виду Hash, как в хеш-функции или сортировке...

Вы можете легко выполнить это, создав класс "wrapper" для String и переопределив метод compareTo