疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

给HashMap排序,使之成为有序Map


 

 
如何给HashMap中的值排序?这个问题很多人都遇到过,很常见的一个方案是使用LinkedHashMap,因为LinkedHashMap可以记住元素放入的顺序,可以认为是真正的“有序”(想让HashMap有序是不可能的),我比较喜欢。然而问题是往往数据已经封装在了HashMap中,我们必须手动的排序后再放入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());
            }
            Collections.sort(keyList);
            Iterator<String> it2 = groupidList.iterator();
            while(it2.hasNext()){
                String key = it2.next();
                attrOfBisGroups.put(key, myMap.get(key));
            }
值得注意的是Collections.sort()方法,API上的解释是:根据元素的自然顺序对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。此外,列表中的所有元素都必须是可相互比较的(也就是说,对于列表中的任何 e1 和 e2 元素,e1.compareTo(e2) 不得抛出 ClassCastException)。我已经测试过String类型是可以直接使用这个接口的,如果你的list中元素是自定义的,那么就要自己实现Comparable,自己编写比较器了。
说了这么多,正文其实是在这里,在用ibatis的queryForMap是查出的结果是无序的,即便是sql中有orderby,即便是ibatis文件中指定了返回值类型(有序类型,如TreeMap,LinkedHashMap),ibatis对数据的填充到底是怎么弄的,我也不清楚,所以才只能在内存中排序,也不失是一种办法,同时抛砖引玉,看看有没有大侠给说说有没有其他办法。