關於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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章