TreeMap排序

根据Key进行排序

Map的根据key排序需要用到TreeMap对象,因为它是默认按照升序进行输出的,可以使用比较器compareTo对它进行降序排序,Comparator可以对集合对象或者数组进行排序的比较器接口,实现该接口的public compare(T o1,To2)方法即可实现排序,该方法主要是根据第一个参数o1,小于、等于或者大于o2分别返回负整数、0或者正整数,若是按照升序可以直接省略比较器代码Map<String, String> treeMap = new TreeMap<String, String>();

如下代码

Java
Map<String, String> treeMap = new TreeMap<String, String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// return o1.compareTo(o2); // 默认:升序排列
return o2.compareTo(o1); // 降序排列
// return 0; // 只返回存储的第一个key的值,这里是"ccccc"
}
});
treeMap.put("c", "ccccc");
treeMap.put("a", "aaaaa");
treeMap.put("b", "bbbbb");
treeMap.put("d", "ddddd"); for (String key : treeMap.keySet()) {
System.out.println(key+" : "+treeMap.get(key));
} 输出:
d : ddddd
c : ccccc
b : bbbbb
a : aaaaa
根据value排序

对value排序我们就需要借助于Collections的sort(List<T> list, Comparator<? super T> c)方法,该方法根据指定比较器产生的顺序对指定列表进行排序。但是有一个前提条件,那就是所有的元素都必须能够根据所提供的比较器来进行比较。

这种方法通用于key和value排序,只需将比较器中o1.getValue().compareTo(o2.getValue())的getValue()改为getKey()即可。

如下:

Java
Map<String, String> treeMap = new TreeMap<String, String>();
treeMap.put("c", "jock");
treeMap.put("a", "rapido");
treeMap.put("d", "free");
treeMap.put("b", "linda"); // 这里将map.entrySet()转换成list
List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(treeMap.entrySet()); // 然后通过比较器来实现排序
Collections.sort(list, new Comparator<Map.Entry<String, String>>() {
@Override
public int compare(Entry<String, String> o1, Entry<String, String> o2) {
// return 0; // 降序
// return o2.getValue().compareTo(o1.getValue()); // 降序
return o1.getValue().compareTo(o2.getValue()); // 升序
}
}); for (Map.Entry<String, String> mapping : list) {
System.out.println(mapping.getKey() + ":" + mapping.getValue());
} 输出:
d:free
c:jock
b:linda
a:rapido
 

注意:

经过上面示例代码的测试发现,

使用第一种匿名内部类方式进行key排序,比较器返回的若是0,则值只有第一条首先插入的输出,而且只输出一条数据。

使用第二种list和比较器方式进行key或value排序,比较器返回的若是0,则值和倒序的值一样,有多少输出多少。(若有朋友知道原因还请文章下留言,谢谢)

HashMap排序

我们都是HashMap的值是没有顺序的,他是按照key的HashCode来实现的。对于这个无序的HashMap我们要怎么来实现排序呢?参照TreeMap的value排序,我们一样的也可以实现HashMap的排序。

经过Key排序

与TreeMap的根据value比较方式一样,将new TreeMap<String, String>();改为new HashMap<String, String>(),再将比较器的getValue换成getKey就行。

经过value排序

与TreeMap的根据value比较方式一样,将new TreeMap<String, String>();改为new HashMap<String, String>();就行。

其他的Map类型排序都可参考以上方法进行

Map集合利用比较器Comparator根据Key和Value的排序的更多相关文章

  1. Map集合按照value和key进行排序

    最近由于特殊的业务需求,需要做相关数据排序,下面就贴出其中的将map集合中按照value或者key进行排序的代码,后面再具体详说. /** * map 集合排序 * @param map * @ret ...

  2. JavaSE Map集合

    Map集合 在Map集合中保存的数据为一组数据,其中:一个数据为key,另外一个数据为value.而key和value具备对应的关系,在集合中它们属于一组(一对)数据.而每个key只能对应唯一的一个v ...

  3. Map.containsKey方法——判断Map集合对象中是否包含指定的键名

    该方法判断Map集合对象中是否包含指定的键名.如果Map集合中包含指定的键名,则返回true,否则返回false. public static void main(String[] args) { M ...

  4. java学习笔记—集合之Map集合

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 12.0px Times } p.p2 { margin: 0.0p ...

  5. 【读书笔记】【深入理解ES6】#7-Set集合和Map集合

    ES6新标准中将Set集合和Map集合添加到JS中. ES5中Set集合和Map集合 在ES5中,开发者们用对象属性来模拟这两种集合. var set = Object.create(null); s ...

  6. java 判断Map集合中包含指定的键名,则返回true,否则返回false。

    public static void main(String[] args) { Map map = new HashMap(); //定义Map对象 map.put("apple" ...

  7. Map集合的认识和理解

    java.util.Map(k,v)集合* Map的特点:* 1.Map集合是一个双列集合,一个元素包含两个值(一个是key,一个是Value)* 2.Map集合中的元素,key和value的类型可以 ...

  8. Map接口中的常用方法和Map集合遍历键找值方式

    Map接口中定义了很多方法,常用的如下: public V put(K key,V value) 将指定的值与此映射中的指定键相关联(可选操作) V remove(Object key); 如果此映射 ...

  9. Map集合概述和Map常用子类

    概述java.util.Map接口 Map<K,V> 有两个泛型 类型参数:K - 此映射所维护的键的类型V - 映射值的类型 特点:1.Map集合是双列集合,一个元素包含两个值,一个是k ...

随机推荐

  1. quartz延迟执行一次

    package com.example.balabala; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; impor ...

  2. 【转载】 OpenCV ——双线性插值(Bilinear interpolation)

    原文地址: https://www.cnblogs.com/yssongest/p/5303151.html --------------------------------------------- ...

  3. Java基础(2)面向对象和封装,对象的创建和使用、java对象的内存图

    1 类和对象 类:是一类事物的描述,抽象的.猫 对象:是一类事物的实例,具体的.某只猫 2 类的定义 成员变量和成员方法 //定义一个学生类 public class Student { //成员变量 ...

  4. [LeetCode&Python] Problem 409. Longest Palindrome

    Given a string which consists of lowercase or uppercase letters, find the length of the longest pali ...

  5. c++——引用的使用

    1.使用引用避免拷贝 c++中拷贝大的类类型对象或容器对象比较低效,甚至有的类型不支持拷贝,这种情况下只能通过引用形参访问该类型的对象 当函数无需修改引用形参的值时,最好使用常量引用 例1:返回两个字 ...

  6. 二分法检索(binary search)(又名二进制搜索)

    定义: 二分法检索的基本思想是设字典中的元素从小到大有序地存放在数组(array)中.首先将给定值key与字典中间位置上元素的关键码(key)比较,如果相等,则检索成功:否则,若key小,则在字典前半 ...

  7. json/pickle模块(序列化)

    什么叫序列化? 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes 为什么要序列化? 你打游戏过程中,打累了,停下来,关掉游戏.想 ...

  8. Mybatis(二,三)

    参考孤傲苍狼的博客,地址如下: http://www.cnblogs.com/xdp-gacl/p/4264301.html 在此声明,自己写博客,是为了学习总结过程中的记录.没有侵权和偷懒的意思. ...

  9. LeetCode - Subtree of Another Tree

    Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and no ...

  10. scala函数等号省略

    例1: 此时没有写返回值,但是有等号,函数会自己推断返回值,此时的返回值是Int def add(x:Int, y:Int) = { x+y} 例2: 此时没有写返回值,也没有等号,无论函数内部有没有 ...