Сортировка строковых ключей карты в соответствии с их числовым значением - PullRequest
0 голосов
/ 04 марта 2012

Мне нужно написать класс, который обрабатывает Map<String, String[]>, обрабатывая его ключи в соответствии с их числовым порядком.Чтобы добавить оскорбление к травме, некоторые ключи не являются допустимыми целыми числами, и они должны быть обработаны в конце в следующем лексикографическом порядке.

Например, если ключи:

["10", "2", "100", "duck", "black"]

Они должны повторяться в следующем порядке -

["2", "10", "100", "black", "duck"]

Какой самый элегантный способ сделать это на Java, кроме итерации и перехвата попыток NumberFormatException?Очевидно, я не могу контролировать формат данной карты.

Ответы [ 2 ]

6 голосов
/ 04 марта 2012

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

class NumbersThenWordsComparator implements Comparator<String> {
    private static Integer intValue(String s) {
        try {
            return Integer.valueOf(s);
        } catch (NumberFormatException e) {
            return null;
        }
    }

    @Override
    public int compare(String s1, String s2) {
        Integer i1 = intValue(s1);
        Integer i2 = intValue(s2);
        if (i1 == null && i2 == null) {
            return s1.compareTo(s2);
        } else if (i1 == null) {
            return -1;
        } else if (i2 == null) {
            return 1;
        } else {
            return i1.compareTo(i2);
        }
    }       
}

public void myMethod(Map<String, String[]> originalMap) {
    TreeMap<String, String[]> t =
        new TreeMap<String, String[]>(new NumbersThenWordsComparator());
    t.putAll(originalMap);
    // now iterate over t, which will produce entries in the desired order
}
0 голосов
/ 04 марта 2012

Используйте SortedMap, который сортирует ключи в соответствии с их естественным порядком.Для строк это лексикография.Я не уверен, что числа идут перед буквами, но в любом случае сортировка будет хорошо определена и последовательна, поэтому вы можете правильно обработать ее, чтобы получить числа первым или последним (т.е. сделать что-то вроде ArrayList<String> keys = yourMap.keySet(), а затем изменить его, если числовые строкине первые).

...