1. 概述
在java map中,一般有重复的key是使用IdentityHashMap存储,可以自动按键进行排序的是TreeMap,但是TreeMap不能使用重复的键,并且不能按照值进行排序,这就需要我们自己定义排序规则进行处理,下面记一下我做的重复键值排序,留个备份
2. 代码
package com.taobao.tpif.common; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.IdentityHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import com.taobao.tpif.common.KeyValueComparator.Order; import com.taobao.tpif.common.KeyValueComparator.Type; public class MapSorter { public static void main(String[] args) { IdentityHashMap<Double, String> map = new IdentityHashMap<Double, String>(); map.put(10.1, "aaaa"); map.put(10.1, "bbbb"); map.put(10.1, "cccc"); map.put(10.08, "dddd"); map.put(10.02, "eeee"); map.put(10.08, "aaaa"); System.out.println("----------[ [ [ 排序前 ] ] ]----------\n"); for (Entry<Double, String> entry : map.entrySet()) { System.out.println("\t" + entry.getKey() + "\t\t" + entry.getValue()); } System.out.println("\n----------[ [ [ 按键降序 ] ] ]----------\n"); List<Map.Entry<Double, String>> list1 = new ArrayList<Map.Entry<Double, String>>(map.entrySet()); Collections.sort(list1, new KeyValueComparator(Type.KEY, Order.DESC)); for (Entry<Double, String> entry : list1) { System.out.println("\t" + entry.getKey() + "\t\t" + entry.getValue()); } System.out.println("\n----------[ [ [ 按值升序 ] ] ]----------\n"); List<Map.Entry<Double, String>> list2 = new ArrayList<Map.Entry<Double, String>>(map.entrySet()); Collections.sort(list2, new KeyValueComparator(Type.VALUE, Order.ASC)); for (Entry<Double, String> entry : list2) { System.out.println("\t" + entry.getKey() + "\t\t" + entry.getValue()); } System.out.println("\n----------[ [ [ 结束啦 ] ] ]----------\n"); } } class KeyValueComparator implements Comparator<Map.Entry<Double, String>> { enum Type { KEY, VALUE; } enum Order { ASC, DESC } private Type type; private Order order; public KeyValueComparator(Type type, Order order) { this.type = type; this.order = order; } @Override public int compare(Entry<Double, String> o1, Entry<Double, String> o2) { switch (type) { case KEY: switch (order) { case ASC: return o1.getKey().compareTo(o2.getKey()); case DESC: return o2.getKey().compareTo(o1.getKey()); default: throw new RuntimeException("顺序参数错误"); } case VALUE: switch (order) { case ASC: return o1.getValue().compareTo(o2.getValue()); case DESC: return o2.getValue().compareTo(o1.getValue()); default: throw new RuntimeException("顺序参数错误"); } default: throw new RuntimeException("类型参数错误"); } } }
3. 输出
----------[ [ [ 排序前 ] ] ]------------ 10.08 aaaa 10.1 cccc 10.08 dddd 10.1 aaaa 10.02 eeee 10.1 bbbb ----------[ [ [ 按键降序 ] ] ]---------- 10.1 cccc 10.1 aaaa 10.1 bbbb 10.08 aaaa 10.08 dddd 10.02 eeee ----------[ [ [ 按值升序 ] ] ]---------- 10.08 aaaa 10.1 aaaa 10.1 bbbb 10.1 cccc 10.08 dddd 10.02 eeee ----------[ [ [ 结束啦 ] ] ]------------
相关推荐
Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。这篇文章主要介绍了Java Map 按照Value排序的实现方法,需要的朋友可以参考下
Map中元素存放是无序的 HashMap注意事项: 1,HashMap底层维护一个数组,我们向HashMap中所放置的对象实际上是存储在该数组当中; 2,当向HashMap中put一对键值时,它会根据key的hashCode值计算出一个位置,该位置...
主要给大家介绍了关于如何利用Java8 Stream API对Map按键或值排序的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Java8具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
此代码为工具类代码,可直接下载使用,调用此方法将需要排序的参数传入即可
// map对象容器里面储存的元素是(key,value)形式的键值对,比如(a,1)(b,20)(c,55) // key不可以重复,value可以重复 // 常用的map接口的实现类有HashMap,LinkedHashMap和TreeMap // HashMap不保证集合中元素的顺序,...
//向map里添加键值对 //如果要对键进行排序Map map=new TreeMap(); Map,String> map=new TreeMap,String>(); //Map map=new HashMap(); map.put(1, "yi"); map.put(23, "er"); map.put(12, "san"); map.put...
1 Map双边队列 1.1 什么是Map 键(Key)值(Value)对 比如:表格: 键 :值 姓名:嘟嘟 年龄:16 性别:男 程序开发大部分数据都是键值对形式的 ... Map双边队列中键(Key)是唯一的,但是值(Value)可以重复 1
这些中间键值对根据键进行排序,为Reduce阶段做准备。 3. **Shuffle阶段**:在Map和Reduce之间,MapReduce框架自动执行一个称为“Shuffle”的过程,它将所有相同键的中间值组合在一起,以便Reduce函数可以处理它们...
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...
9.2.2 访问map键值 288 9.3 重点复习 291 9.4 课后练习 292 chapter10 输入输出 299 10.1 inputstream与outputstream 300 10.1.1 串流设计的概念 300 10.1.2 串流继承架构 303 10.1.3 串流处理装饰器 ...
如果要按照键值保存或者访问数据,使用什么数据结构? 要掌握Collection相关的接口和类的使用 56.使用StringBuffer类与String类进行字符串连接时有何区别? 57.调用Thread类的destroy()方法有什么后果? 58.多...
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...
解决方案: 获取绝对路径读取 Json 并转换为 Java Object 并获取相应的 Map 对键值进行排序并打印在日志中根据模因密钥准备 LulzScore 将两个哈希映射加载到 memelulz 对象中并写回 JSON 用例 1:从类路径获取输入 ...
TreeMap是一种基于红黑树实现的有序映射(SortedMap)。它实现了NavigableMap接口,可以按照键的自然顺序或自定义排序规则对键值对进行排序和访问。
第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 ... 实例206 运用映射的相关类(Map) 363 实例207 运用集的相关类(Set) 365 12.2 List 368 实例208 增加所需的元素 368 ...
实例221 改变Properties文件中的键值 399 第13章 多线程编程(教学视频:121分钟) 405 13.1 多线程的五种基本状态 405 实例222 启动线程 405 实例223 参赛者的比赛生活(线程休眠唤醒) 407 实例224 资源搜索并下载...
实例221 改变Properties文件中的键值 399 第13章 多线程编程(教学视频:121分钟) 405 13.1 多线程的五种基本状态 405 实例222 启动线程 405 实例223 参赛者的比赛生活(线程休眠唤醒) 407 实例...
实例221 改变Properties文件中的键值 399 第13章 多线程编程(教学视频:121分钟) 405 13.1 多线程的五种基本状态 405 实例222 启动线程 405 实例223 参赛者的比赛生活(线程休眠唤醒) 407 实例224 资源搜索...
实例221 改变Properties文件中的键值 399 第13章 多线程编程(教学视频:121分钟) 405 13.1 多线程的五种基本状态 405 实例222 启动线程 405 实例223 参赛者的比赛生活(线程休眠唤醒) 407 实例224 资源搜索并下载...
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...