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

pn9klfpd  于 2023-03-11  发布在  Java
关注(0)|答案(4)|浏览(239)
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.可比较的〈?超级java.xml.数据类型.XMLGregoringCalendar〉”
我也尝试过将其保存在LinkedHashMap中,并使用Collections.util方法,但无法做到。

wljmcqd8

wljmcqd81#

要按键对Map进行排序,请使用TreeMap
正如javadoc所说:
Map根据其键的自然顺序排序,或者根据创建Map时提供的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);
    }
})
vsnjm48y

vsnjm48y2#

错误信息明确指出-XMLGregorianCalendar没有实现Comparable,因此您将无法执行排序操作。因此,为了快速帮助您解决问题,请参阅this post。
此外,使用TreeMap比使用Reinventing the wheel更好。

o8x7eapl

o8x7eapl3#

您的问题在于密钥对象XMLGregorianCalendar不是Comparable
类型参数“javax.xml.datatype.XMLGregorianCalendar”不在其界限内;应实现“java.lang.Comparable”
您可以使用Date,这是一个可比。
使用如下:

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);
    }
}
x4shl7ld

x4shl7ld4#

基于Andreas answer,您可以使用以下命令:

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

相关问题