1. 程式人生 > >Java對HashMap中的Entry實體根據Key或者Value進行排序

Java對HashMap中的Entry實體根據Key或者Value進行排序

前幾天在寫程式碼時候遇見對Map中元素根據Value排序的情景,就想抽空花點時間認真學習鞏固總結一下。

說道排序,我們無非還是得和比較說起,沒有比較何有順序!在Java中可以參與比較的兩個介面莫非是:

可以比較的,實現該介面的類本身就具備了比較的特徵。

public interface Comparable<T> {//Comparable是java.lang包中類
    public int compareTo(T o);
}

另一個是比較器,本身不具備比較功能:
public interface Comparator<T> {
	
    int compare(T o1, T o2);

    boolean equals(Object obj);//預設所有類介面都是Object類的子類,所以本類我們可以不自己實現
}


接下來看看Comparable示例:

/**
 * 
 * Comparable是可以比較的,也就是說實現Comparable介面自身就有比較的特徵了
 * 
 * @author Daxin
 *
 */
class Cat implements Comparable<Cat> {
	private int age;
	private String name;

	public int getAge() {
		return age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Cat(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}

	@Override
	public int compareTo(Cat o) {

		return this.age - o.age;
	}

}

Main函式:
public static void main(String[] args) {

	Cat c1 = new Cat(5, "Tomcat");
	Cat c2 = new Cat(3, "Tom");
	
	System.out.println(c1.compareTo(c2)>0?c1.getName():c2.getName());
	

}


再看看Comparator示例:

class Dog {

	private int age;
	private String name;

	@Override
	public String toString() {
		return "Dog [age=" + age + ", name=" + name + "]";
	}

	public Dog(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

/**
 * 
 * 這是一個Dog的比較器,然而Dog本身不具備比較的特徵,只能使用DogComparator進行比較
 * 當然也可以使用Dog實現Comparator介面,但是這麼設計是不合理的
 * 
 * @author Daxin
 *
 */
class DogComparator implements Comparator<Dog> {  //Comparator是java.util包中的

	@Override
	public int compare(Dog o1, Dog o2) {
		// TODO Auto-generated method stub
		return o1.getAge() - o2.getAge();
	}

}

Main方法如下:
public static void main(String[] args) {
	
	Dog d1=new Dog(3, "Maomao");
	Dog d2=new Dog(4, "Huanhuan");
	//例項化比較器
	DogComparator comparator = new DogComparator();
	System.out.println(comparator.compare(d1, d2)>0?d1.getName():d2.getName());

}


接下來看看Map根據Entry的key或Value排序實現:

/**
 * 
 * Bean
 * 
 * @author Daxin
 *
 */
class User {

	private int age;
	private int level;

	public User(int age, int level) {
		super();
		this.age = age;
		this.level = level;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getLevel() {
		return level;
	}

	public void setLevel(int level) {
		this.level = level;
	}

	@Override
	public String toString() {
		return "User [age=" + age + ", level=" + level + "]";
	}

}

Main方法,藉助於Collections的sort工具方法進行排序:
/**
 * 
 * 將HashMap中的實體根據Key排序
 * 
 * 
 * @author Daxin
 *
 */
public class Main1 {

	public static void main(String[] args) {

		Map<Integer, User> map = new HashMap<>();

		Random rn = new Random();

		for (int i = 0; i < 5; i++) {
			map.put(rn.nextInt(20), new User(rn.nextInt(20), rn.nextInt(20)));
		}

		System.out.println(map);

		// 將map中key-value實體轉成序列。  由於Collections僅僅支援對List的子類進行排序,所以轉成list,況且HashMap是無順序的
		ArrayList<Map.Entry<Integer, User>> list = new ArrayList<>(map.entrySet());

		System.out.println(list);
                // 由於Collections僅僅支援對List的子類進行排序,所以轉成list,況且HashMap是無順序的
		Collections.sort(list, new Comparator<Map.Entry<Integer, User>>() {//傳進去一個比較器

			@Override
			public int compare(Map.Entry<Integer, User> o1, Map.Entry<Integer, User> o2) {//比較器的比較規則函式

				return o1.getKey() - o2.getKey();//指定規則,如果想根據Value比較的話直接使用getValue即可
			}
		});

		System.out.println(list);

	}

}


在使用Map時候要多多結合Map的內部類Entry使用,往往會事半功倍!