对HashMap进行简单排序的使用
package com.ming.test001;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
//对HashMap进行排序(按照用户的年龄大小进行排序)
public class SortHashMap {
// 构造一个成员内部类:User-静态的,方便外部类main方法调用
static class User {
private String name;
private Integer age;
// 书写有参的构造方法,便于new对象
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
// 重写User用户类的toString方法,方便对排序前后的内容进行对比
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
public static void main(String[] args) {
// 创建HashMap集合用来存储new的用户实例,且还是无序的
HashMap<Integer, User> users = new HashMap<>();
users.put(1, new User("张三", 25));
users.put(3, new User("李四", 22));
users.put(2, new User("王五", 28));
System.out.println(users);
System.out.println("====================");
// 通过sortHashMap进行排序
System.out.println(sortHashMap(users));
}
// 编写一个排序的sortHashMap方法,将要排的hashmap作为参数传入,将排好序的Map输出
public static HashMap<Integer, User> sortHashMap(HashMap<Integer, User> sortMap) {
// 将要排序的map的键值对存入set集合
Set<Entry<Integer, User>> entrySet = sortMap.entrySet();
// 将set的键值对集合转成list存入,便于工具类的排序方法
List<Entry<Integer, User>> list = new ArrayList<Entry<Integer, User>>(entrySet);
// 使用Collections的sort方法进行排序,排序使用匿名内部类实现
Collections.sort(list, new Comparator<Entry<Integer, User>>() {
@Override
public int compare(Entry<Integer, User> o1, Entry<Integer, User> o2) {
// 通过返回的值进行排序:为正-当前对象>比较的对象,位置排在后面,负-当前对象<比较的对象,位置排在前,0-位置不变
return o2.getValue().getAge() - o1.getValue().getAge();
}
});
// 有序的集合,可以来有序的存储排好序的集合list
LinkedHashMap<Integer, User> linkedHashMap = new LinkedHashMap<>();
// 遍历
for (Entry<Integer, User> entry : list) {
linkedHashMap.put(entry.getKey(), entry.getValue());
}
// 跳出,并返回值
return linkedHashMap;
}
}
书写期间还跟着学习了一些之前不了解的知识:
关于在SortHashMap 类中的main方法中无法实例化内部类User,当时没有注意到的问题:main方法是静态方法,所以想要实例化内部类,可以实现的方法如下:
1.标注User为静态内部类
2.通过new SortHashMap().new User();
这两种方式实现。
关于Conllections中的sort方法中排序详解可参考大佬的讲解-
大佬的解释