Сортировка карты по ключу (дата, строка) - PullRequest
4 голосов
/ 23 октября 2019
Map<XMLGregorianCalendar, String> SortedByTimeForJourney = new HashMap<XMLGregorianCalendar, String>();

Я должен отсортировать его по ключу (XMLGregorianCalendar). Я пробовал это

 SortedByTimeForJourney.entrySet().stream().sorted(Map.Entry.<XMLGregorianCalendar, String>comparingByKey()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new));

, но он показывает, что параметр типа 'javax.xml.datatype.XMLGregorianCalendar' не находится в пределах своей границы;должен реализовать 'java.lang.Comparable'

Я также попытался сделать это, сохранив его в LinkedHashMap, а также используя метод Collections.util, но не смог.

Кто-то Пожалуйста, помогите мне.

Ответы [ 4 ]

6 голосов
/ 23 октября 2019

Чтобы отсортировать Map по ключу, используйте TreeMap.

Как сказано в javadoc:

Карта сортируется в соответствии с естественным порядком ее ключей или по Comparator, предоставленному во время создания карты, в зависимости от того, какой конструктор используется.

Начиная с XMLGregorianCalendar не реализует Comparable, т.е. не имеет естественного упорядочения , вы должны указать Comparator в конструкторе .

В Java 8+ используйте:

new TreeMap<>(XMLGregorianCalendar::compare)

В более старых версиях Java используйте:

new TreeMap<>(new Comparator<XMLGregorianCalendar>() {
    @Override
    public int compare(XMLGregorianCalendar cal1, XMLGregorianCalendar cal2) {
        return cal1.compare(cal2);
    }
})
2 голосов
/ 23 октября 2019

В сообщении об ошибке четко указано, что - XMLGregorianCalendar не реализует Comparable, и, следовательно, вы не сможете выполнить операцию сортировки. Итак, просто чтобы помочь вам быстро, пожалуйста, обратитесь к этой записи.

Кроме того, использование TreeMap является лучшим вариантом, чем Reinventing the wheel.

2 голосов
/ 23 октября 2019

Ваша проблема с ключевым объектом XMLGregorianCalendar не Сравнимо .

Тип Параметр 'javax.xml.datatype.XMLGregorianCalendar' не имеет своей границы;следует реализовать 'java.lang.Comparable'

Вы можете использовать Дата , которая является Сопоставимой .

Использовать следующим образом:

Map<Date, Integer> sortedByTimeForJourney = new TreeMap<Date, Integer>();

Получить время из XMLGregorianCalendar:

[XMLGregorianCalendar Instance].toGregorianCalendar().getTime()

Пример: sortedByTimeForJourney по умолчанию сортируется на основе даты.

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.Date;
import java.util.Map;
import java.util.TreeMap;

public class Main {

    public static void main(String[] args) throws DatatypeConfigurationException {
        Map<Date, Integer> sortedByTimeForJourney = new TreeMap<>();
        for (int i = 12; i > 0; i--) {
            XMLGregorianCalendar xCal = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(2019, i, i, 0);
            sortedByTimeForJourney.put(xCal.toGregorianCalendar().getTime(), i);
        }
        System.out.println(sortedByTimeForJourney);
    }
}
1 голос
/ 23 октября 2019

На основе Андреас ответ вы можете использовать это:

Map<XMLGregorianCalendar, String> SortedByTimeForJourney = new TreeMap<>(Comparator.comparing(XMLGregorianCalendar::toGregorianCalendar));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...