按键(日期,字符串)对 Map 进行排序

4
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<?super java.xml.datatype.XMLGregoringCalendar>'。

我还尝试过将其保存在LinkedHashMap中,也使用了Collections.util方法,但无法实现。

4个回答

7
要按键排序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);
    }
})

是的,它正在工作。谢谢Andreas。 TreeMap<XMLGregorianCalendar, String> SortedBy = new TreeMap<XMLGregorianCalendar, String>(new MyComp());MyComp如下所示。class MyComp implements Comparator{ public int compare(XMLGregorianCalendar d1,XMLGregorianCalendar d2){ return d1.compare(d2); } } - sandeep gaur

2
错误信息明确说明 - XMLGregorianCalendar 没有实现 Comparable 接口,因此您将无法执行排序操作。为了快速帮助您,请参考这篇文章。
此外,使用TreeMap重新发明轮子更好。

2
您的问题与关键对象XMLGregorianCalendar不是Comparable有关。

类型参数'javax.xml.datatype.XMLGregorianCalendar'不在其范围内; 应实现'java.lang.Comparable'

您可以使用Date,它是一个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);
    }
}

它不起作用。实际上,我的日期是这样的“2020-01-19T04:55:00”,它还包括时间。 - sandeep gaur
1
我已经添加了一个例子。希望它有所帮助。 - nayakam
嘿,谢谢,Naykam。我是这样做的,谢谢。TreeMap<XMLGregorianCalendar, String> SortedBy = new TreeMap<XMLGregorianCalendar, String>(new MyComp());,而我的MyComp类是这样的:class MyComp implements Comparator{ public int compare(XMLGregorianCalendar d1, XMLGregorianCalendar d2){ return d1.compare(d2); } } - sandeep gaur

1

根据Andreas answer,您可以使用以下内容:

Map<XMLGregorianCalendar, String> SortedByTimeForJourney = new TreeMap<>(Comparator.comparing(XMLGregorianCalendar::toGregorianCalendar));

2
更简单的方法是使用 new TreeMap<>(XMLGregorianCalendar::compare) - Andreas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接