Создайте SortedMap в Java с помощью специального компаратора - PullRequest
21 голосов
/ 01 мая 2010

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

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

Za,FOO
Ab,Bar

Ответы [ 2 ]

32 голосов
/ 01 мая 2010

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

    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 более читабельно.

Смотри также:

0 голосов
/ 01 мая 2010

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

Вы могли бы легко сделать это, создав класс-обертку для String и переопределив метод CompareTo

...