如何对HashMap键进行排序

时间:2012-01-28 17:04:22

标签: java hashmap

我有一个问题

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

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

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

最后我得到的结果如下:

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

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

5 个答案:

答案 0 :(得分:24)

根据定义,HashMaps不存储键的排序顺序。但是,您可以通过以下方式获取密钥数组来完成此任务:Object[] keys = map.keySet().toArray();然后使用数组排序列表: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实例。

答案 1 :(得分:4)

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

e.g。

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

这里我使用的Date类比普通的字符串更适合存储日期。

答案 2 :(得分:2)

迭代它时,

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

我建议您将HashMap密钥从String更改为Date,例如HashMap<Date, List<AppPrjMilestone>>。这应该可以解决问题。

oops - 将其设为TreeMap<Date, List<AppPrjMilestone>>