关于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 
 */
class ValueComparator> implements Comparator {
	Map base;
	
	public ValueComparator(Map 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 
 */
class KeyComparator> implements Comparator {
	Map base;
	
	public KeyComparator(Map 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 map = new HashMap();
		map.put("A", "403");
		map.put("C", "98");
		map.put("B", "0023");
		ValueComparator valueComparator = new ValueComparator(map);
		TreeMap valueTreeMap = new TreeMap(valueComparator);
		
		System.out.println("原始Map: " + map);
		valueTreeMap.putAll(map);
		System.out.println("按照Value降序后的Map: " + valueTreeMap);
		
		KeyComparator keyComparator = new KeyComparator(map);
		TreeMap keyTreeMap = new TreeMap(keyComparator);
		keyTreeMap.putAll(map);
		System.out.println("按照Key降序后的Map: " + keyTreeMap);
	}
}

二、Map的有序性

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

你可能感兴趣的:(Java,EE,Map,按照Key排序,按照Value排序,Map有序性)