list中含有map的排序问题

Map的种类

在Java中,Map的主要作用是存储键值对。由于是根据键得到值,所以不允许键重复。它主要有如下几个类别:

HashMap:

最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。Hashtable与HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了
Hashtable在写入时会比较慢。

LinkedHashMap

保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

TreeMap

实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

按键排序

从上面Map的种类介绍我们可以看出,TreeMap是自带按键排序的功能的,只需要在创建的时候同时实现一个Compare的接口就可以了,例子如下:

private static void sort_by_key(){
    Map<Integer, Integer> treeMap = new TreeMap<>(new Comparator<Integer>() {
      @Override
      public int compare(Integer o1, Integer o2) {
        return o2-o1; //倒序.这里说明一下,如果返回负值,则o1先输出,反之则o2
      }
    });
     
    //填充数据
    for(int i = 0; i < 100;i++){
      int key = (int)(10000*Math.random());
      int value = (int)(10000*Math.random());
      treeMap.put(key, value);
    }
    outMap(treeMap);
  }
 
public static void outMap(Map<Integer, Integer> map){
    for(Integer integer:map.keySet()){
      System.out.println("key="+integer+"  value="+map.get(integer));
    }
}
/* 结果如下:
key=9977  value=80
key=9684  value=7108
key=9422  value=1706
key=9264  value=1210
key=9248  value=4758
key=9024  value=7048
key=8892  value=3124
key=8879  value=6414
key=8814  value=8171
key=8728  value=1538
key=8513  value=4956
key=8462  value=5617
key=8355  value=8912

从上面可以看出,按键排序是不难的,而安置排序就比较麻烦一些,需要将Map转一下。

按值排序

package cn.uicps.sort;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Sort {
    /**
     * list中含有map根据map的value排序
     * @param args
     */

public static void main(String[] args) {
         List<Map<Object, Object>> list = new ArrayList<Map<Object, Object>>();        
            Map<Object, Object> map = new HashMap<Object, Object>();
            Map<Object, Object> map1 = new HashMap<Object, Object>();
            Map<Object, Object> map2 = new HashMap<Object, Object>();
            Map<Object, Object> map3 = new HashMap<Object, Object>();
    
            map.put("number", 1);
            map1.put("number", 2);
            map2.put("number", 4);
            map3.put("number", 3);
            list.add(map);
            list.add(map1);
            list.add(map2);
            list.add(map3);
            System.out.println("排序前"+list);
            Collections.sort(list, new Comparator<Map<Object, Object>>() {    
                public int compare(Map<Object, Object> o1, Map<Object, Object> o2) {
                    int map1value = (Integer) o1.get("number");
                    int map2value = (Integer) o2.get("number");    
                    /**
                     * 只有在value的值是int是用下面写法
                     * 如果value是其他类型的用compareTo比较
                     */
                    return map1value - map2value;
                    //return String.valueOf(map1value).compareTo(String.valueOf(map2value));
                }
            });
            System.out.println("排序后"+list);
    }

}

时间: 2024-10-05 22:00:51

list中含有map的排序问题的相关文章

fastjson解析list ,object中含有list, object中含有map

1.首先定义测试vo package com.haiyisoft.cAssistantWeb.ui; import java.sql.Timestamp; public class vo {private Long id;private Timestamp date;public Timestamp getDate() { return date;}public void setDate(Timestamp date) { this.date = date;}private Long craea

STL模板中的map的使用与例题

最近的计分赛,记得自己的都只是过了两题.遇到了两次map,自己在寒假看了一点的map,只知道在字符串匹配的时候可以用的到.但是自己对map的使用还是不够熟练使用,这回在第一次和第二次的计分赛中都遇到可以用map快速写出的AC题目.而且代码精简. map是一种二叉树的数据存储结构.map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的. map的特点:  1.存储Key-value对                     

javascript中使用Map

mis.comm.js.Map = function() { this.elements = new Array(); //获取MAP元素个数 this.size = function() { return this.elements.length; } //推断MAP是否为空 this.isEmpty = function() { return (this.elements.length < 1); } //删除MAP全部元素 this.clear = function() { this.el

Java中的Map List Set等集合类

Map List Set等集合类: 一.概述 在JAVA的util包中有两个所有集合的父接口Collection和Map,它们的父子关系: +Collection 这个接口extends自 --java.lang.Iterable接口 ├+List(接口 代表有序,可重复的集合.列表) │├ ArreyList     (Class 数组,随机访问,没有同步,线程不安全) │├ Vector        (Class  数组                   同步        线程全) │

ES6中的Map集合(与java里类似)

Set类型可以用来处理列表中的值,但是不适用于处理键值对这样的信息结构.ES6也添加了Map集合来解决类似的问题 一.Map集合 JS的对象(Object),本质上是键值对的集合(Hash结构),但是传统上只能用字符串当作键.这给它的使用带来了很大的限制 为了解决这个问题,ES6提供了Map数据结构.它类似于对象,也是键值对的集合,但是"键"的范围不限于字符串,各种类型的值(包括对象)都可以当作键.也就是说,Object结构提供了"字符串-值"的对应,Map结构提供

判断给定十进制整数的二进制形式中含有几个1

两种判断一个给定整数的二进制形式中含有几个1的简单方法: 主要思想是通过按位与(&)运算和位移运算(<< >>)实现 1 unsigned int_number( int n) 2 { 3 if (n < 0) 4 return; 5 unsigned count = 0; 6 while (n != 0) 7 { 8 if ((n & 1) != 0) 9 ++count; 10 n >>= 1; 11 } 12 return count; 13

线程池中的线程的排序问题

1 package org.zln.thread.poolqueue; 2 3 import org.slf4j.Logger; 4 import org.slf4j.LoggerFactory; 5 6 import java.util.Comparator; 7 import java.util.UUID; 8 import java.util.concurrent.*; 9 10 /** 11 * 线程池中的线程的排序问题 12 * Created by sherry on 16/11/4

做肉酱的猪肉中含有丰富的蛋白质及脂肪

炸酱面是一种汉族面食,如今流行于北京.天津,辽宁.吉林等北方地区,做法也根据地区与习惯的不同而有所不同,但炸酱面讲究肉酱美味与蔬菜搭配,蔬菜从豆芽.豆苗.黄瓜.胡萝卜等蔬菜到青豆.黄豆等豆类食品不等,还可根据自己颈腰椎疾病的口味选择海鲜.肉类等配料. 从营养价值来说,做肉酱的猪肉中含有丰富的蛋白质及脂肪.碳水化合物.钙.磷.铁等成分,是最常见.最平价的肉类食品之一:而用面粉制作的面条,含有碳水化合物及少量B族维生素,是提供人体能量的“主力军”,有心灵手巧的人家还会自己往面粉中加入甘蓝汁.青菜汁.

深度分析如何在Hadoop中控制Map的数量

深度分析如何在Hadoop中控制Map的数量 [email protected] 很多文档中描述,Mapper的数量在默认情况下不可直接控制干预,因为Mapper的数量由输入的大小和个数决定.在默认情况下,最终input 占据了多少block,就应该启动多少个Mapper.如果输入的文件数量巨大,但是每个文件的size都小于HDFS的blockSize,那么会造成 启动的Mapper等于文件的数量(即每个文件都占据了一个block),那么很可能造成启动的Mapper数量超出限制而导致崩溃.这些逻