Java 日历中的getDisplayNames提供未排序的月份

Java 日历中的getDisplayNames提供未排序的月份,java,calendar,Java,Calendar,我从日历中成功获取月份,如下所示: monthMap = calendar.getDisplayNames(Calendar.MONTH, Calendar.LONG, Locale.getDefault()); 但月份似乎是这样的: 不管怎样,我会把它们作为1月1日的索引0,然后是其余的吗 我会对列表进行排序,但没有排序标准 有什么想法吗?您将得到一个完全未排序的映射,因此需要根据值实现排序标准 Map<String, Integer> map = Calendar.getI

我从
日历
中成功获取月份,如下所示:

monthMap = calendar.getDisplayNames(Calendar.MONTH, Calendar.LONG, Locale.getDefault());
但月份似乎是这样的:

不管怎样,我会把它们作为1月1日的索引0,然后是其余的吗

我会对列表进行排序,但没有排序标准


有什么想法吗?

您将得到一个完全未排序的映射,因此需要根据值实现排序标准

 Map<String, Integer> map = Calendar.getInstance().getDisplayNames(Calendar.MONTH, Calendar.LONG,
            Locale.getDefault());
 List<Entry<String, Integer>> months = new ArrayList<>(map.entrySet());
 months.sort((e1, e2) -> Integer.compare(e1.getValue(), e2.getValue()));
 months.stream().forEach(System.out::println);
或者保持与java8的一致性

Arrays.stream(Month.values()).forEach(System.out::println);

你只需要找到一种方法来分类。你很可能会得到一个HashMap,它不保证任何订单

Map<String, Integer> map = Calendar.getInstance()
    .getDisplayNames(Calendar.MONTH, Calendar.LONG, Locale.getDefault());

List<Entry<String, Integer>> entries = 
    new ArrayList<Entry<String, Integer>>(map.entrySet()); 

//This line sorts entries by key.
Collections.sort(entries, 
    (entry1, entry2) -> entry1.getKey().compareTo(entry2.getKey()));

//Now the list will be sorted:
for(Entry<String, Integer> entry: entries) {
    System.out.println(entry.getKey() + " = " + entry.getValue());
}

首先,我建议停止使用
日历
(正如已经建议的那样)

旧类(
Date
Calendar
SimpleDateFormat
)具有和,它们正在被新的API所取代

如果使用<强> java 8 < />,请考虑使用这更容易


如果您使用的是Java
getDisplayNames
,则返回一个
Map
;我猜它是一个HashMap,因此没有定义顺序。是的,它是一个HashMap,我的问题是如何对pic
monthMap.entrySet()中显示的键集进行排序。排序(/*您的条件*/)。收集(…)
。标准是什么?如何对月份进行排序?仅供参考,您使用的旧日期时间类现在已经过时,被java.time类取代。这确实是正确的答案,但不是我问题的答案@KostasDrakonakis,在这种情况下,你能接受答案吗?根据这个答案,它们将按字母顺序排序。谢谢你的尝试。我创建了自己的hashMap,从DateFormatSymbols中获取项目,并使用方法:Good Answer返回项目。我将更强调直接使用
Month
enum对象。我怀疑最初的海报是使用字符串来跟踪月份作为更多工作的实体,而不仅仅是用于展示的月份名称。通过对枚举对象的正确理解,OP可以学习将
Month
对象作为参数而不是字符串传递,还可以学习将枚举对象用作映射中的键或列表中的项,以及类中的成员变量中的值。换句话说,在任何地方使用
Month
,只生成与月份相关的字符串,以便向用户演示。
Map<String, Integer> map = Calendar.getInstance()
    .getDisplayNames(Calendar.MONTH, Calendar.LONG, Locale.getDefault());

List<Entry<String, Integer>> entries = 
    new ArrayList<Entry<String, Integer>>(map.entrySet()); 

//This line sorts entries by key.
Collections.sort(entries, 
    (entry1, entry2) -> entry1.getKey().compareTo(entry2.getKey()));

//Now the list will be sorted:
for(Entry<String, Integer> entry: entries) {
    System.out.println(entry.getKey() + " = " + entry.getValue());
}
Collections.sort(entries, 
    (entry1, entry2) -> Integer.valueOf(entry1.getKey()).compareTo(Integer.valueOf(entry2.getKey())));
// created the sorted list
List<String> months = new ArrayList<>();
for (Month m : Month.values()) {
    months.add(m.getDisplayName(TextStyle.FULL, Locale.getDefault()));
}
System.out.println("list: " + months);

// create the map (using LinkedHashMap, as it preserves the insertion order)
Map<String, Integer> map = new LinkedHashMap<>();
int i = 0;
for (String m : months) {
    map.put(m, i++);
}
System.out.println("map: " + map);