`

java map的重复键值的排序

    博客分类:
  • java
阅读更多

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

----------[ [ [ 结束啦 ] ] ]------------

 

 

0
6
分享到:
评论

相关推荐

    Java Map 按照Value排序的实现方法

    Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。这篇文章主要介绍了Java Map 按照Value排序的实现方法,需要的朋友可以参考下

    java中Map集合的排序方法

    Map中元素存放是无序的 HashMap注意事项: 1,HashMap底层维护一个数组,我们向HashMap中所放置的对象实际上是存储在该数组当中; 2,当向HashMap中put一对键值时,它会根据key的hashCode值计算出一个位置,该位置...

    如何利用Java8 Stream API对Map按键或值排序

    主要给大家介绍了关于如何利用Java8 Stream API对Map按键或值排序的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Java8具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    Java中实现参数名ASCII码从小到大排序(字典序).doc

    此代码为工具类代码,可直接下载使用,调用此方法将需要排序的参数传入即可

    java中set、list和map的使用方法实例

    // map对象容器里面储存的元素是(key,value)形式的键值对,比如(a,1)(b,20)(c,55) // key不可以重复,value可以重复 // 常用的map接口的实现类有HashMap,LinkedHashMap和TreeMap // HashMap不保证集合中元素的顺序,...

    set.list.map接口

    //向map里添加键值对 //如果要对键进行排序Map map=new TreeMap(); Map,String&gt; map=new TreeMap,String&gt;(); //Map map=new HashMap(); map.put(1, "yi"); map.put(23, "er"); map.put(12, "san"); map.put...

    Java中的Map集合

    1 Map双边队列 1.1 什么是Map 键(Key)值(Value)对 比如:表格:  键 :值  姓名:嘟嘟  年龄:16  性别:男 程序开发大部分数据都是键值对形式的 ... Map双边队列中键(Key)是唯一的,但是值(Value)可以重复 1

    Java MapReduce学习笔记实战内容-小白基础内容

    这些中间键值对根据键进行排序,为Reduce阶段做准备。 3. **Shuffle阶段**:在Map和Reduce之间,MapReduce框架自动执行一个称为“Shuffle”的过程,它将所有相同键的中间值组合在一起,以便Reduce函数可以处理它们...

    java summary(java笔记)

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    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 串流处理装饰器 ...

    JAVA面试题最全集

    如果要按照键值保存或者访问数据,使用什么数据结构? 要掌握Collection相关的接口和类的使用 56.使用StringBuffer类与String类进行字符串连接时有何区别? 57.调用Thread类的destroy()方法有什么后果? 58.多...

    java 面试题 总结

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...

    JSONRW:json读写

    解决方案: 获取绝对路径读取 Json 并转换为 Java Object 并获取相应的 Map 对键值进行排序并打印在日志中根据模因密钥准备 LulzScore 将两个哈希映射加载到 memelulz 对象中并写回 JSON 用例 1:从类路径获取输入 ...

    java集合-TreeMap的使用

    TreeMap是一种基于红黑树实现的有序映射(SortedMap)。它实现了NavigableMap接口,可以按照键的自然顺序或自定义排序规则对键值对进行排序和访问。

    java范例开发大全源代码

    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟) 2 ... 实例206 运用映射的相关类(Map) 363  实例207 运用集的相关类(Set) 365  12.2 List 368  实例208 增加所需的元素 368 ...

    java范例开发大全

    实例221 改变Properties文件中的键值 399 第13章 多线程编程(教学视频:121分钟) 405 13.1 多线程的五种基本状态 405 实例222 启动线程 405 实例223 参赛者的比赛生活(线程休眠唤醒) 407 实例224 资源搜索并下载...

    Java范例开发大全 (源程序)

     实例221 改变Properties文件中的键值 399  第13章 多线程编程(教学视频:121分钟) 405  13.1 多线程的五种基本状态 405  实例222 启动线程 405  实例223 参赛者的比赛生活(线程休眠唤醒) 407  实例...

    Java范例开发大全(全书源程序)

    实例221 改变Properties文件中的键值 399 第13章 多线程编程(教学视频:121分钟) 405 13.1 多线程的五种基本状态 405 实例222 启动线程 405 实例223 参赛者的比赛生活(线程休眠唤醒) 407 实例224 资源搜索...

    java范例开发大全(pdf&源码)

    实例221 改变Properties文件中的键值 399 第13章 多线程编程(教学视频:121分钟) 405 13.1 多线程的五种基本状态 405 实例222 启动线程 405 实例223 参赛者的比赛生活(线程休眠唤醒) 407 实例224 资源搜索并下载...

    超级有影响力霸气的Java面试题大全文档

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...

Global site tag (gtag.js) - Google Analytics