如何对HashMap键进行排序

我有一个问题

HashMap<String, List> dateMilestoneMap = new HashMap<String, List>(); 

我将动态键放在Hashmap对象中,如下所示:

 dateMilestoneMap.put(""+crateDate,value); 

最后我得到的结果如下:

 ("28/01/2012",value) ("01/01/2012",value) ("26/01/2012",value) 

我希望以desc或asc顺序返回键值对。 我怎样才能做到这一点?

根据定义,HashMaps不存储键的排序顺序。 但是,您可以通过以下方式获取键的数组来实现此目的: Object[] keys = map.keySet().toArray(); 然后使用Arrays对Arrays.sort(keys);排序: Arrays.sort(keys); 最后迭代每个键并从HashMap中检索值。

for(Object key : keys) { System.out.println(map.get(key)); }

这里的排序步骤将使算法在O(n lg n)而不是O(n)中运行,这可以使用排序数据结构。

这将按字典顺序对列表进行排序。 由于看起来您的问题使用了常见的美国日期格式,因此这将按日,然后按月和最后年份对列表进行排序。 这可能不太正确。 您可以使用日期的年,月,日字符串格式,也可以采用更合适的密钥对象。 Joda-Time的DateTime和DateTimeComparator非常有用。 在调用Arrays.sort(keys, comparator);时,只需使用DateTime作为键和DateTimeComparator实例Arrays.sort(keys, comparator);

地图的键存储在无法排序的Set中。 您可以通过将地图集的键添加到List并对其进行排序来实现。

例如

 List sortedKeys = new ArrayList(dateMilestoneMap.size()); sortedKeys.addAll(dateMilestoneMap.keySet()); Collections.sort(sortedKeys); //sorts in ascending date order //(pass in custom Comparator to sort differently).. 

在这里,我使用了Date类,它比存储字符串更好地存储日期。

迭代时HashMap不提供任何排序​​(或者甚至保证如果循环多次,顺序将保持不变)。 如果您想要对键进行自然排序,请尝试使用TreeMap 。 请注意,您的字符串格式为dd/mm/yy ,因此当TreeMap它们进行TreeMap时,它将首先按日升序,而不是按年升序,这可能不是您想要的。 您应该使用像yy/mm/dd这样的字符串,切换到使用类似Date更好地封装该信息的类,或者在构造知道如何在右侧对dd/mm/yy字符串进行排序的TreeMap时定义自己的Comparator订购

HashMap没有定义元素的迭代顺序。 如果要检索按键排序的元素,请使用TreeMap 。 但是,由于您以“DD / MM / YYYY”格式存储字符串,顺序可能不是您想要的顺序,因此要么使用日期作为键,要么至少使用“YYYY-MM-DD”forms的字符串”。

我建议您将HashMap键从String更改为Date,例如HashMap> 。 这应该够了吧。

oops – 使TreeMap>