Сортировать ключи, которые являются записями даты в хэш-карте - PullRequest
5 голосов
/ 07 июня 2011

У меня есть hashMap, который имеет следующие значения в качестве ключей value(sql date , integer) пар:

a.put("31-05-2011",67);
a.put("01-06-2011",89);
a.put("10-06-2011",56);
a.put("25-05-2011",34);

когда я пытаюсь отсортировать hashMap на основе ключей, используя: Картаified_a = новая TreeMap (a); и отобразить ключи следующим образом:

01-06-2011,10-06-2011,25-05-2011, 31-05-2011

но я хочу, чтобы ключи сортировались как

31-05-2011,25-05-2011,01-06-2011 ,10-06-2011

Я вижу, что значения сортируются на основе первых 2 цифр (это значение даты), но мне нужно, чтобы значение месяца также учитывалось и сортировалось сначала по месяцам, а затем по каждому месяцу сортировать соответствующие дни. , Любые подсказки ??

Ответы [ 6 ]

9 голосов
/ 07 июня 2011

Лучшее решение IMO - использовать другой тип данных для ключей - тип данных, который на самом деле представляет дату, и который сортируется в порядке натуральной даты.Если не указано иное, я бы использовал тип Joda Time LocalDate, который точно соответствует тому, что вы хотите (просто дата, а не дата / время и т. Д.).

Если вывы действительно хотите использовать строковые ключи, но можете изменить их формат, вы можете использовать формат yyyy-MM-dd, который можно сортировать естественным образом.

В качестве альтернативы вы можете передать Comparator<String> в конструкторе TreeMap, где компаратор - это тот, который анализирует две строки, когда их просят сравнить, и выполняет сравнение на основе проанализированных значений года / месяца / дня.Нет конструктора, который бы использовал пользовательский компаратор и существующей карты, поэтому вам понадобится что-то вроде:

Map<String, Integer> modified = new TreeMap<String, Integer>(customComparator);
modified.putAll(a);

Этот подход будет относительно медленным, если у вас естьмного данных (из-за многократного разбора) и немного неудобно для записи - я бы использовал более подходящий тип данных, если возможно.

6 голосов
/ 07 июня 2011

Вы можете использовать как

Map<Date, Integer> m = new HashMap<Date, Integer>(); 

    DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");

    m.put(new java.sql.Date(dateFormat.parse("31-05-2011").getTime()),67);
    m.put(new java.sql.Date(dateFormat.parse("01-06-2011").getTime()),89);
    m.put(new java.sql.Date(dateFormat.parse("10-06-2011").getTime()),56);
    m.put(new java.sql.Date(dateFormat.parse("25-05-2011").getTime()),34);


    Map<Date, Integer> m1 = new TreeMap(m);
    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

    for (Map.Entry<Date, Integer> entry : m1.entrySet())
    {
        System.out.println(df.format(entry.getKey()));
    }
5 голосов
/ 02 октября 2012

У меня было требование отменить сортировку дат (сначала самая последняя дата). Я сделал это с помощью кода ниже:

Map<Date, Integer> dateMap = new TreeMap<Date, Integer>(new Comparator<Date>() {
    public int compare(Date date1, Date date2) {
        return date2.compareTo(date1);
    }
});

Вызов dateMap.keySet() приведет к Set с ключами, в которых самые последние даты возвращаются первыми.

2 голосов
/ 07 июня 2011

Вы должны передать пользовательский компаратор в конструктор TreeMap, который будет сравнивать ваши ключи как даты вместо строк (или использовать java.util.Date в качестве ключа, в этом случае это произойдет из коробки, поскольку дата реализует Comparable).

1 голос
/ 27 октября 2011

Создать компаратор:

public class DateComparator implements Comparator<Date> {
    public int compare(Date date1, Date date2) {
        return date1.compareTo(date2);
    }
}

И использовать компаратор с TreeMap

Map<Date, Integer> comparedDates = new TreeMap<Date, Integer>(new DateComparator());
// here fill you <Date, Integer> map like:
comparedDates.put(new Date(System.currentTimeMillis()), 123);

Все даты в вашей карте будут отсортированы.

0 голосов
/ 07 июня 2011

Возможно, вы захотите использовать TreeMap вместо HashMap и создать Карту с пользовательской Comparator, которая обеспечивает сортировку.

Вот черновик для анонимного компаратора (который неразобрать строку в сопоставимый объект даты):

new Comparator<String>() {

    @Override
    public int compare(String date1, String date2) {
        // skipping tests! Assuming, all date are well formatted

        String[] parts1 = date1.split("-");
        String[] parts2 = date2.split("-");

        String reordered1 = parts1[2] + parts1[1] + parts1[0];
        String reordered2 = parts2[2] + parts2[1] + parts2[0];

        return reordered1.compareTo(reordered2);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...