关于Map分别按照Key和Value排序的实现以及HashMap的无序性

前言:
关于Map按照Key和Value排序的实现(code),更为重要的是如何将排序后的Map按照顺序取出后重新赋值给另外一个Map时,需要注意的问题:HashMap是没有顺序的,其原理是根据hash值进行分桶的。(HashMap没有顺序,TreeMap和LinkHashMap是有顺序的)

一、Map按照Key和Value排序的实现代码

如下:(这里的方法是通用的,key和value的类型没有要求,如果是自定义的类,需要实现Comparable接口)

/**
 * Sort Map by value
 * @author huxiutao
 *
 * @param <T>
 */
class ValueComparator<T extends Comparable<T>> implements Comparator<T> {
	Map<String, T> base;
	
	public ValueComparator(Map<String, T> base) {
		super();
		this.base = base;
	}

	@Override
	public int compare(T arg0, T arg1) {
		// TODO Auto-generated method stub
		int compareTo = base.get(arg0).compareTo(base.get(arg1));
		// 降序
		if (compareTo>=0) {
			return -1;
		}
		return 1;
	}
	
}

/**
 * Sort map by key
 * @author huxiu
 *
 * @param <T>
 */
class KeyComparator<T extends Comparable<T>> implements Comparator<T> {
	Map<String, T> base;
	
	public KeyComparator(Map<String, T> base) {
		super();
		this.base = base;
	}

	@Override
	public int compare(T arg0, T arg1) {
		// TODO Auto-generated method stub
		int compareTo = arg0.compareTo(arg1);
		// 降序
		if (compareTo>=0) {
			return -1;
		}
		return 1;
	}
}

使用示例:

import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;

/**
 * 
 * @author Huxiutao
 *
 */
public class SortMap {
	/**
	 * 1. Test for Sort Map by Key
	 * 2. Test for Sort Map by value;
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("A", "403");
		map.put("C", "98");
		map.put("B", "0023");
		ValueComparator valueComparator = new ValueComparator(map);
		TreeMap<String, String> valueTreeMap = new TreeMap<String, String>(valueComparator);
		
		System.out.println("原始Map: " + map);
		valueTreeMap.putAll(map);
		System.out.println("按照Value降序后的Map: " + valueTreeMap);
		
		KeyComparator keyComparator = new KeyComparator(map);
		TreeMap<String, String> keyTreeMap = new TreeMap<String, String>(keyComparator);
		keyTreeMap.putAll(map);
		System.out.println("按照Key降序后的Map: " + keyTreeMap);
	}
}

二、Map的有序性

HashMap没有顺序,HashMap的原理是根据hash值进行分桶的。
TreeMap和LinkedHashMap则是有顺序的,所以在上面的示例中,要将HashMap中的值重新赋值(TreeMap.putAll)给TreeMap。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值