题:
已知一个HashMap<Integer,User>集合,User有username(String)和age(int)属性,请写一个方法实现对HashMap的排序功能,该方法接收HashMap<Integer,User>为形参,返回类型为HashMap<Integer,User>,要求对HashMap中的User的age进行倒序排序,排序时key=value键值对不能拆散。
注:
要做出这道题必须对集合的体系结构非常的熟悉。HashMap本身是不可排序的,但是该题偏偏让给HashMap进行排序,那我们就得想在API中有没有这样的Map是有序的,LinkedHashMap,这是Map结构,也是链表结构,有序的,更可喜可贺的是它是HashMap的子类,我们返回LinkedHashMap<Integer,User>即可,还符合面向接口(父类编程的思想)。
但凡是对集合的操作,我们应该保持一个原则——能用JDK中的API就用JDK中的API,比如排序算法我们不应该使用冒泡或者选择排序等算法,而是首先想到用Collections集合工具类。
Code
import java.util.*;
import java.util.Map.Entry;
public class HashMapTest {
public static void main(String[] args) {
HashMap<Integer, User> userHashMap = new HashMap<>();
userHashMap.put(1, new User("张三", 25));
userHashMap.put(2, new User("李四", 18));
userHashMap.put(3, new User("王五", 28));
System.out.println(userHashMap);
HashMap<Integer, User> sortMap = sortHashMap(userHashMap);
System.out.println(sortMap);
}
public static HashMap<Integer, User> sortHashMap(HashMap<Integer, User> map) {
// 首先得到map的键值对集合
Set<Entry<Integer, User>> entrySet = map.entrySet();
// 将set集合转换成List集合,为了使用工具类的排序方法
List<Entry<Integer, User>> list = new ArrayList<Entry<Integer, User>>(entrySet);
// 使用Collections集合工具类对list进行排序,排序规则使用匿名内部类来实现
Collections.sort(list, new Comparator<Entry<Integer, User>>() {
@Override
public int compare(Entry<Integer, User> o1, Entry<Integer, User> o2) {
// 按照要求根据User的age进行倒序排序
return o2.getValue().getAge() - o1.getValue().getAge();
}
});
// 创建一个新的有序的HashMap子类的集合
LinkedHashMap<Integer, User> linkedHashMap = new LinkedHashMap<Integer, User>();
// 将List中的数据存储到LinkedHashMap中
for (Entry<Integer, User> entry : list) {
linkedHashMap.put(entry.getKey(), entry.getValue());
}
// 返回结果
return linkedHashMap;
}
}
class User {
private String username;
private int age;
public User(String username, int age) {
this.username = username;
this.age = age;
}
public String getUsername() {
return username;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", age=" + age +
'}';
}
}
运行结果
{1=User{username='张三', age=25}, 2=User{username='李四', age=18}, 3=User{username='王五', age=28}}
{3=User{username='王五', age=28}, 1=User{username='张三', age=25}, 2=User{username='李四', age=18}}