Java對HashMap中的Entry實體根據Key或者Value進行排序
阿新 • • 發佈:2019-01-24
前幾天在寫程式碼時候遇見對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使用,往往會事半功倍!