把HashMap的元素排序后放到LinkedHashMap中

如何给HashMap中的值排序?HashMap本身从底层原理上是不可能有序的,HashMap底层的实现是数组+链表/红黑树,元素进来时是通过hash算法计算的(具有随机性),但是迭代时是从index 0到最后,因而无序。

LinkedHashMap见名知意,它通过链表记录插入顺序,访问顺序=插入顺序,所以我们可以使用LinkedHashMap,只不过需要手动的把原数据排序后再放入LinkedHashMap。

        Map myMapTmp = XXDao().getXXX();
        
        Map myMap = new LinkedHashMap();
        
        List keyList = new ArrayList();
        
        Iterator it = myMapTmp.keySet().iterator();
        
        while (it.hasNext())
        {
            keyList.add(it.next());
        }
        // 对key排序
        Collections.sort(keyList);
        
        Iterator 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数据的不清楚,以后有机会看源码吧。

你可能感兴趣的:(MyBatis)