关于java中Map排序问题

我们在应用Map中排序问题时,会面临很多问题(比如选择哪种类型的Map应用,如何实现按照自己特定要求进行排序等)。
1 什么是Map
在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value这就是我们平时说的键值对。
2 HashMap和TreeMap 区别
HashMap:底层是哈希表数据结构。线程不同步。TreeMap:底层是二叉树数据结构,线程不同步,可用于给Map集合中的键进行排序。
3 常规Map的实现
HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。
(1)HashMap(): 构建一个空的哈希映像
(2)HashMap(Map m): 构建一个哈希映像,并且添加映像m的所有映射
(3)HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像
(4)HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像
TreeMap:基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。
(1)TreeMap():构建一个空的映像树
(2)TreeMap(Map m): 构建一个映像树,并且添加映像m中所有元素
(3)TreeMap(Comparator c): 构建一个映像树,并且使用特定的比较器对关键字进行排序
(4)TreeMap(SortedMap s): 构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序
4 性能
HashMap:适用于在Map中插入、删除和定位元素。
Treemap:适用于按自然顺序或自定义顺序遍历键(key)。



实际程序中,我们应用HashMap的频率要高于Treemap,那么如何进行排序呢?个人找到了一下的一些方法,总结如下:
A 按照key排序
对于有排序的Map,如Tree’Map,只能按照键排序(用put 和remove方法进行添加和删除)。以下方案,使用hashmap进行创建和添加,如果需要按照key排序,可以将hashmap作为参数传递到new TreeMap(hashmap),可以完成按照key 排序。
TreeMap treemap = new TreeMap(hashmap);
B 按照value排序
一般情况下选择使用hashmap,通过添加比较器来完成。

public class mapex {
//此函数只要功能是将HashMap按照值的大小进行排列输出
        public static void main(String[] args) {
            //创建一个hashmap
                Map<String, Integer> keyMap = new      HashMap<String, Integer>();
            keyMap.put("009", 45);
            keyMap.put("010", 31);
            keyMap.put("003", 29);
            //将映射表传入到arraylist中
            ArrayList<Entry<String, Integer>> list = new ArrayList<Map.Entry<String,Integer>>(keyMap.entrySet());
            //Collections包装器,根据指定比较器产生的顺序对指定列表进行排序。
            Collections.sort(list, new Comparator<Entry<String,Integer>>() {
                public int compare(Entry<String, Integer> o1,Entry<String, Integer> o2) {   
                    return (o1.getValue()-o2.getValue());
                }   
            });
            for (Entry<String, Integer> entry : list) {             System.out.println(entry.getKey()+">>>>>"+entry.getValue());
            }
        }
}

C Hashtable内部排列的方式是散列排布,所以当输出信息时会是无序的,此类实现一个哈希表,该哈希表将键映射到相应的值。为了能保证输出的数据按照一定的顺序排序,就不能用java自带的函数对hashtable 进行处理,需要将hashtable 转换成array(数组)后进行处理,我们可以使用array的sort,重写compare方法,进行自定义排序。
/**
* 方法名称:getSortedHashtable
* 参数:Hashtable h 引入被处理的散列表
* 描述:将引入的hashtable.entrySet进搜索行排序,并返回
*/
public class EntrySerielal {

   public static Map.Entry[] getSortedHashtable(Hashtable h) {
       //返回此映射中包含的键的 Set 视图。
       Set set = h.entrySet();
       //将set转成array进行排序
       Map.Entry[] entries = (Map.Entry[]) set.toArray(new Map.Entry[set.size()]); 
       //使用arrays的sort方法,重写compare方法
       Arrays.sort(entries,new Comparator() {
        public int compare(Object o1, Object o2) {
             Object key1 =  ((Map.Entry) o1).getKey();
             Object key2 =  ((Map.Entry) o2).getKey();
             return ((Comparable) key1).compareTo(key2);
        }   
       }) ;
       return entries;

       }
   public static void main(String[] args) {
       Hashtable t =new Hashtable(10);
       t.put("003", 25);
       t.put("001", 20);
       t.put("009", 95);
       Map.Entry[] set = getSortedHashtable(t);

       for (int i=0;i<set.length;i++){

           System.out.println(set[i].getKey().toString());

           System.out.println(set[i].getValue().toString());       
       }
   }
  }

“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值