如何对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