java Map 之 排序(key,value)

一:起因:

(1)现实中需要Map容器进行排序的情况很多很多:因为Map<key,value>键值对的存储结构特别是HashMap的结构是非常优秀的,数据存储就难免对其进行排序;

(2)数据处理,只要用到映射关系的,离不开Map,这在数据处理中是非常实用的,而排序是对数据的进一步处理;

(3)Map排序的方式有很多种,两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value)

二:排序的算法

(1)按键排序

jdk内置的java.util包下的TreeMap<K,V>既可满足此类需求,向其构造方法 TreeMap(Comparator<? super K> comparator)  传入我们自定义的比较器即可实现按键排序。

// 主类
public class MapSortDemo {
	public static void main(String[] args) {
		Map<String, String> map = new TreeMap<String, String>();
		map.put("KFC", "kfc");
		map.put("WNBA", "wnba");
		map.put("NBA", "nba");
		map.put("CBA", "cba");
		Map<String, String> resultMap = sortMapByKey(map);	//按Key进行排序
		for (Map.Entry<String, String> entry : resultMap.entrySet()) {
			System.out.println(entry.getKey() + " " + entry.getValue());
		}
	}

	/**
	 * 使用 Map按key进行排序
	 * @param map
	 * @return
	 */
	public static Map<String, String> sortMapByKey(Map<String, String> map) {
		if (map == null || map.isEmpty()) {
			return null;
		}
		Map<String, String> sortMap = new TreeMap<String, String>(new MapKeyComparator());
		sortMap.putAll(map);
		return sortMap;
	}
}

//比较器类
public class MapKeyComparator implements Comparator<String>{
	public int compare(String str1, String str2) {
		return str1.compareTo(str2);
	}
}

说明一:比较器类,MapKeyComparator implements Comparator<String> 中的参数是通过类似模板类的Comparator<>传进来的,再重载其compare()函数即可,比较简单。

说明二:主类中的 sortMapByKey(Map<String, String> map) 函数中声明TreeMap<String,String>(new MapKeyComparator())进行key值排序,再调用sortMap.putAll(map) 复制到新的map中。

说明三:数据是用TreeMap存储的。

(2)按值排序

按值排序就相对麻烦些了,貌似没有直接可用的数据结构能处理类似需求,需要我们自己转换一下。

Map本身按值排序是很有意义的,很多场合下都会遇到类似需求,可以认为其值是定义的某种规则或者权重。

原理:将待排序Map中的所有元素置于一个列表中,接着使用Collections的一个静态方法 sort(List<T> list, Comparator<? super T> c) 

来排序列表,同样是用比较器定义比较规则。排序后的列表中的元素再依次装入Map,为了肯定的保证Map中元素与排序后的List中的元素的顺序一致,使用

LinkedHashMap数据类型

实现代码

// 主类
public class MapSortDemo {
	public static void main(String[] args) {
		Map<String, String> map = new TreeMap<String, String>();
		map.put("KFC", "kfc");
		map.put("WNBA", "wnba");
		map.put("NBA", "nba");
		map.put("CBA", "cba");
		Map<String, String> resultMap = sortMapByValue(map); //按Value进行排序
		for (Map.Entry<String, String> entry : resultMap.entrySet()) {
			System.out.println(entry.getKey() + " " + entry.getValue());
		}
	}

	/**
	 * 使用 Map按value进行排序
	 * @param map
	 * @return
	 */
	public static Map<String, String> sortMapByValue(Map<String, String> map) {
		if (map == null || map.isEmpty()) {
			return null;
		}
		Map<String, String> sortedMap = new LinkedHashMap<String, String>();
		List<Map.Entry<String, String>> entryList = new ArrayList<Map.Entry<String, String>>(map.entrySet());
		Collections.sort(entryList, new MapValueComparator());
		Iterator<Map.Entry<String, String>> iter = entryList.iterator();
		Map.Entry<String, String> tmpEntry = null;
		while (iter.hasNext()) {
			tmpEntry = iter.next();
			sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
		}
		return sortedMap;
	}
}

//比较器类
public class MapValueComparator implements Comparator<Map.Entry<String, String>> {
	public int compare(Entry<String, String> me1, Entry<String, String> me2) {
		return me1.getValue().compareTo(me2.getValue());
	}
}

说明一:比较器类,MapValueComparator implements Comparator<Map.Entry<String,String>> 中的参数是通过类似模板类的Comparator<>传进来的,再重载其compare()函数即可,只是参数是Map.Entry<String,String>的接口类,compare()函数的两个参数也相应的变为Entry<String,String>。

说明二:主类中的 sortMapByKey(Map<String, String> map) 函数中声明LinkedHashMap<String,String>再用ArrayList<Map.Entry<String,String>>(map.entrySet())进行List形式的存储,再调用collections.sort(entryList,

new MapKeyComparator())进行排序;最后把entryList转化为LinkedMap

说明三:数据是用TreeMap存储的。

时间: 2024-08-23 17:35:06

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

Java Map 如何实现Key 的唯一性?

大家都知道,在Map和Set不可存在重复元素? 但是对于内部的细节我们并不了解,今天我们就一块来 探讨一下! 1 对于 HashMap  HashSet 他们的底层数据结构的实现是:维护了一张  HashTable .容器中的元素全部存储在Hashtable 中.他们再添加元素的时候,是如何判断是否存在有重复元素的呢?  每一个被添加的元素都有一个 hashCode(哈希值),他们先比较哈希值,是否相同? 不相同的元素,添加进入 HashTable.   如果hashCode相同的话, 再去比较

Java Map 怎样实现Key 的唯一性?

大家都知道.在Map和Set不可存在反复元素? 可是对于内部的细节我们并不了解.今天我们就一块来 探讨一下! 1 对于 HashMap  HashSet 他们的底层数据结构的实现是:维护了一张  HashTable .容器中的元素所有存储在Hashtable 中.他们再加入元素的时候,是怎样推断是否存在有反复元素的呢?  每个被加入的元素都有一个 hashCode(哈希值),他们先比較哈希值,是否同样? 不同样的元素,加入进入 HashTable.   假设hashCode同样的话, 再去比較

Java Map 按Key排序和按Value排序

package test; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Tr

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

java Map排序(升序、降序、随机排序)

基础知识: 1 HashMap会使用key,根据hashcode进行默认排序. 2  LinkedHashMap根据存入先后进行排序 代码展示: 1 随机排序 java Map排序(升序.降序.随机排序),布布扣,bubuko.com

算法实战:根据Key或Value对Map进行排序及其应用

摘要: 我们知道,Map是 Java Collection Framework 的重要成员,也是我们最常用的容器类之一.Map的实现多种多样,包括HashMap.LinkedHashMap等.但是,无论实际中使用哪种实现,我们在编程过程中常常会遇到诸如根据Key或Value对Map进行排序.保持Map插入顺序等问题,本文特别针对以上几个问题给出了具体解法,并分享华为一道与我们主题极为相关的笔试题. 版权声明: 本文原创作者:书呆子Rico 作者博客地址:http://blog.csdn.net/

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

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

Java语言利用Collections.sort对Map,List排序

1.main方法包含TreeMap排序1,TreeMap排序2,HashMap排序,List<Integer>排序,List<Bean>排序,List<Map>排序 package com.tao.test; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Li

Java Map按Value排序

Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等. TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法.    HashMap的值是没有顺序的,它是按照key的HashCode来实现的,对于这个无序的HashMap我们要怎么来实现排序呢?参照TreeMap的v