Map排序(按key排序,按value排序)

  主要分两种,按键排序、按值排序。 而且,按key排序主要用于TreeMap,而按value排序则对于Map的子类们都适用。

一、按键排序

按Key排序主要用于TreeMap,可以实现按照Key值的大小,在对象插入时直接插入到合适的位置,保持Map的顺序性。

来看TreeMap的构造函数:TreeMap(Comparator<? super K> comparator):构造一个新的、空的树映射,该映射根据给定比较器进行排序。

这里的比较器是key的比较器。所以定义比较器时用于比较的两个参数是Key的数据类型的对象。

实例代码如下:

public class MapSortTest {

public static void main(String[] args) {
  Map<String,String> stu=new TreeMap<>(new MyComparator());//传进来一个key的比较器对象来构造treemap
  stu.put("apple", "55");
  stu.put("boy", "32");
  stu.put("cat", "22");
  stu.put("dog", "12");
  stu.put("egg", "11");
  //map的遍历:把key抽取出来用set存放,然后用迭代器遍历keyset,同时用map.get(KEY)获取key所对应的value。

  Set<String> keySet=stu.keySet();
  Iterator it=keySet.iterator();
  while (it.hasNext()) {
    String next = (String)it.next();
    System.out.println(next+","+stu.get(next));
      }
  }
}

//定义key的比较器,比较算法根据第一个参数o1,小于、等于或者大于o2分别返回负整数、0或者正整数,来决定二者存放的先后位置:返回负数则o1在前,正数则o2在前。
class MyComparator implements Comparator<String>{
  public int compare(String o1, String o2) {
    return o1.compareTo(o2);
  }
}

二、按值排序

与按值排序只使用TreeMap不同,按值排序由于其方法所用到的类型的统一性,所以能用于Map的所有子类

主要用到的知识点有;

1:map.entrySet()将map里的每一个键值对取出来封装成一个Entry对象并存放到一个Set里面。

2:泛型Map.Entry<type1,type2> 因为Key-value对组成Entry对象,此处指明Entry对象中这两个成员的数据类型。

3:Collections.sort(List<T> list, Comparator<? super T> c) 集合类的排序方法,通过自定义的比较器进行排序。这里的list存放的对象是entry对象。定义比较器对entry对象中的value属性进行比较。

实例代码如下:

public class MapSortTest {
  public static void main(String[] args) {
    Map<String,String> stu=new TreeMap<>();//用TreeMap储存

    // Map<String,String> stu=new HashMap<>();//用HashMap储存

    stu.put("apple", "55");
    stu.put("boy", "32");
    stu.put("cat", "22");
    stu.put("dog", "12");
    stu.put("egg", "11");

    //1:把map转换成entryset,再转换成保存Entry对象的list。
    List<Map.Entry<String,String>> entrys=new ArrayList<>(stu.entrySet());
    //2:调用Collections.sort(list,comparator)方法把Entry-list排序
    Collections.sort(entrys, new MyComparator());
    //3:遍历排好序的Entry-list,可得到按顺序输出的结果
    for(Map.Entry<String,String> entry:entrys){
      System.out.println(entry.getKey()+","+entry.getValue());
        }
      }
  }

  //自定义Entry对象的比较器。每个Entry对象可通过getKey()、getValue()获得Key或Value用于比较。换言之:我们也可以通过Entry对象实现按Key排序。
  class MyComparator implements Comparator<Map.Entry>{
    public int compare(Map.Entry o1, Map.Entry o2) {
      return ((String)o1.getValue()).compareTo((String)o2.getValue());
      }
    }

原文地址:https://www.cnblogs.com/huangdabing/p/9252029.html

时间: 2024-10-28 08:05:46

Map排序(按key排序,按value排序)的相关文章

C++ STL中Map的按Key排序和按Value排序

原文  http://blog.csdn.net/iicy266/article/details/11906189 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择. 我们这样定义,map<string, int>,其中学生姓名用string类型,作为Key:该学生的成绩用int类型,作为value.这样一来,我们可以根据学

java Map 之 排序(key,value)

一:起因: (1)现实中需要Map容器进行排序的情况很多很多:因为Map<key,value>键值对的存储结构特别是HashMap的结构是非常优秀的,数据存储就难免对其进行排序: (2)数据处理,只要用到映射关系的,离不开Map,这在数据处理中是非常实用的,而排序是对数据的进一步处理: (3)Map排序的方式有很多种,两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value) 二:排序的算法 (1)按键排序 jdk内置的java.util包下的TreeMa

Java Map集合利用比较器Comparator根据Key和Value的排序

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

获取map中根据key进行排序的value数据

今天做的项目中遇到了获取map中根据key进行排序的value数据,key中保存的内容是字符串类型.      map的知识点好久没用有点生疏,不知道怎么去使用.看看之前同事写的map根据key排序的代码,发现他是先把key都取出来封装到一个List中,然后用Collections.sort方法对List排序,按照排完序的顺序去除value顺序加入到一个新的List中.感觉此种方式的循环次数太多,于是上网找找能不能直接排序的方法,看见有人写直接保存到TreeMap中的数据就能实现按照进行排序的功

C++ STL中Map的按Key排序跟按Value排序(转)

C++ STL中Map的按Key排序和按Value排序 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进行存储就是个不错的选择. 我们这样定义,map<string, int>,其中学生姓名用string类型,作为Key:该学生的成绩用int类型,作为value.这样一来,我们可以根据学生姓名快速的查找到 他的成绩. 但是,我们除了希望能够查询

对Map按key和value分别排序

一.什么是Map? 在讲解Map排序之前,我们先来稍微了解下map. map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等.其中这四者的区别如下(简单介绍): HashMap:我们最常用的Map,它根据key的HashCode 值来存储数据,根据key可以直接获取它的Value,同时它具有很快的访问速度.HashMap最多只允许一条记录的key值为Null(多条会覆盖);允许多条记录的Value为 Null.非同步的.

Golang对map中的key进行排序

package main import ( "fmt" "sort" ) func main() { //首先生成26个字母充当map中的key var a = 'a' var m map[string]int = make(map[string]int) for i := 0; i < 26; i++ { // fmt.Printf("%c", a) //%c 是输出字符 key := fmt.Sprintf("%c"

Java map 详解 - 用法、遍历、排序、常用API等

尊重原创:http://www.cnblogs.com/lzq198754/p/5780165.html 概要: java.util 中的集合类包含 Java 中某些最常用的类.最常用的集合类是 List 和 Map. Map 提供了一个更通用的元素存储方法.Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值. 本文主要介绍java map的初始化.用法.map的四种常用的遍历方式.map的排序以及常用api. | |目录 1Map用法 ·类

Map、Reduce任务中Shuffle和排序的过程

Map.Reduce任务中Shuffle和排序的过程 流程分析: Map端: 1.每个输入分片会让一个map任务来处理,默认情况下,以HDFS的一个块的大小(默认为64M)为一个分片,当然我们也可以设置块的大小.map输出 的结果会暂且放在一个环形内存缓冲区中(该缓冲区的大小默认为100M,由io.sort.mb属性控制),当该缓冲区快要溢出时(默认为缓冲区大小的 80%,由io.sort.spill.percent属性控制),会在本地文件系统中创建一个溢出文件,将该缓冲区中的数据写入这个文件.

python练习:字典value值排序,key值排序

#字典value值排序,key值排序 from random import * dict1 = {x:randint(5,12) for x in "aijwt"} dict2 = {randint(5,12):y for y in "aibjwte"} print ('dict1:',dict1) print ('dict2:',dict2) print ("将字典按value倒序显示,办法(collections的Counter):") fr