已知一个 HashMap<Integer,User>集合,User 有 name(String)和 age(int)属性。请写一个方法实现对HashMap 的排序功能,该方法接收 HashMap<Integer,User>为形参,返回类型为 HashMap<Integer,User>,要求对 HashMap 中的 User 的 age 倒序进行排序。排序时 key=value 键值对不得拆散。
public class User {
private String name;
private Integer age;
public User() { }
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; }
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class HashMapTest {
public static void main(String[] args) {
HashMap<Integer, User> users = new HashMap<>();
users.put(11,new User("张三",26));
users.put(33,new User("李四",21));
users.put(22,new User("王五",23));
users.put(44,new User("赵六",25));
System.out.println("排序前");
System.out.println(users);
HashMap<Integer, User> sortHashMap = sortHashMap(users);
System.out.println("排序后");
System.out.println(sortHashMap);
}
private static HashMap<Integer, User> sortHashMap(HashMap<Integer, User> usersHashMap) {
//1.传入HashMap得到键值对集合
Set<Map.Entry<Integer, User>> entries = usersHashMap.entrySet();
//2.要对键值对中User的年龄Age进行排序,讲Set转化为List重写Comparator进行比较,
// List里面依然是键值对,保留了传入HashMap键值的关系,同时又根据值User的Age排了序
ArrayList<Map.Entry<Integer, User>> list = new ArrayList<>(entries);
list.sort(new Comparator<Map.Entry<Integer, User>>() {
@Override
public int compare(Map.Entry<Integer, User> o1, Map.Entry<Integer, User> o2) {
//按照要求根据 User 的age的倒序进行排
return o2.getValue().getAge() - o1.getValue().getAge();
}
});
//3.创建一个LinkedHashMap是HashMap的子集合可以用用于接收!!!,特点就是有序,HashMap的子集合!!!
LinkedHashMap<Integer, User> linkedHashMap = new LinkedHashMap<>();
//List中的键值存入LinkedHashMap
for (Map.Entry<Integer, User> entry : list) {
linkedHashMap.put(entry.getKey(),entry.getValue());
}
return linkedHashMap;
}
}
运行结果
--------------排序前--------------
{33=User{name='李四', age=21}, 22=User{name='王五', age=23}, 11=User{name='张三', age=26}, 44=User{name='赵六', age=25}}
--------------排序后--------------
{11=User{name='张三', age=26}, 44=User{name='赵六', age=25}, 22=User{name='王五', age=23}, 33=User{name='李四', age=21}}
这是一道很不错的集合相关的题目,熟练做出来要对集合很熟悉。