把HashMap的元素排序后放到LinkedHashMap中
如何给HashMap中的值排序?HashMap本身从底层原理上是不可能有序的,HashMap底层的实现是数组+链表/红黑树,元素进来时是通过hash算法计算的(具有随机性),但是迭代时是从index 0到最后,因而无序。
LinkedHashMap见名知意,它通过链表记录插入顺序,访问顺序=插入顺序,所以我们可以使用LinkedHashMap,只不过需要手动的把原数据排序后再放入LinkedHashMap。
Map<String, String> myMapTmp = XXDao().getXXX();
Map<String, String> myMap = new LinkedHashMap<String, String>();
List<String> keyList = new ArrayList<String>();
Iterator<String> it = myMapTmp.keySet().iterator();
while (it.hasNext())
{
keyList.add(it.next());
}
// 对key排序
Collections.sort(keyList);
Iterator<String> it2 = keyList.iterator();
while (it2.hasNext())
{
String key = it2.next();
myMap.put(key, myMap.get(key));
}
值得注意的是Collections.sort()方法:根据元素的自然顺序对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。String类型是可以直接使用这个接口的,如果你的list中元素是自定义的,那么就要自己实现Comparable,自己编写比较器了。
如果是自然排序,其实可以直接把数据“倒腾”到TreeMap中,TreeMap读取时也是自然排序的。当然TreeMap也可以按照自定义比较器排序。只是有时候我们没有很明显的排序规律,但是就是要让Map记住put的顺序,然后取出来,此时LinkedHashMap再合适不过。
ibatis的queryForMap查出的结果是无序的,即便sql中有orderby,即便是ibatis文件中指定了返回值类型(如TreeMap,LinkedHashMap),ibatis到底是如何填充Map数据的不清楚,以后有机会看源码吧。
