关于java中Map排序问题

来源:互联网 发布:警察男友那个很大 知乎 编辑:程序博客网 时间:2024/05/22 04:26

我们在应用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());              }   }  }

“`

0 0
原创粉丝点击