• HashMap 排序


    本文章,摘抄自:2018黑马程序最新面试题汇总

    已知一个 HashMap<Integer,User>集合, User 有 name(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 集合工具类。

     1 public class HashMapSort {
     2 
     3     public static void main(String[] args) {
     4         HashMap<Integer, User> users = new HashMap<>();
     5         users.put(1, new User("张三", 25));
     6         users.put(2, new User("李四", 20));
     7         users.put(3, new User("王五", 30));
     8 
     9         Set<Integer> sets = users.keySet();
    10         System.out.println("排序前:");
    11         for (Integer integer : sets) {
    12             System.out.println(integer + ":" + users.get(integer));
    13         }
    14 
    15         System.out.println("排序后:");
    16         HashMap<Integer, User> sortHashMap = sortHashMap(users);
    17         Set<Integer> sets2 = sortHashMap.keySet();
    18         for (Integer integer : sets2) {
    19             System.out.println(integer + ":" + sortHashMap.get(integer));
    20         }
    21 
    22     }
    23 
    24     public static HashMap<Integer, User> sortHashMap(HashMap<Integer, User> map) {
    25         // 首先拿到map的键值对集合
    26         Set<Entry<Integer, User>> entrySet = map.entrySet();
    27 
    28         // 将set集合转为List集合,为什么?为了使用工具类的排序方法
    29         List<Entry<Integer, User>> list = new ArrayList<>(entrySet);
    30         // 使用collections集合工具类对list进行排序,排序规则使用匿名内部类来实现
    31         Collections.sort(list, new Comparator<Entry<Integer, User>>() {
    32 
    33             @Override
    34             public int compare(Entry<Integer, User> o1, Entry<Integer, User> o2) {
    35                 // 按要求根据User的age的倒序进行排
    36                 return o2.getValue().getAge() - o1.getValue().getAge();
    37             }
    38         });
    39         // 创建一个新的有序的HashMap子类的集合
    40         LinkedHashMap<Integer, User> linkedHashMap = new LinkedHashMap<>();
    41         // 将list中的数据存储在LinkedHashMap中
    42         for (Entry<Integer, User> entry : list) {
    43             linkedHashMap.put(entry.getKey(), entry.getValue());
    44         }
    45         // 返回结果
    46         return linkedHashMap;
    47     }
    48 }
     1 public class User {
     2 
     3     private String name;
     4     private Integer age;
     5 
     6     public User(String name, Integer age) {
     7         super();
     8         this.name = name;
     9         this.age = age;
    10     }
    11 
    12     public String getName() {
    13         return name;
    14     }
    15 
    16     public void setName(String name) {
    17         this.name = name;
    18     }
    19 
    20     public Integer getAge() {
    21         return age;
    22     }
    23 
    24     public void setAge(Integer age) {
    25         this.age = age;
    26     }
    27 
    28     @Override
    29     public String toString() {
    30         return "User [name=" + name + ", age=" + age + "]";
    31     }
    32 
    33 }

    执行结果:

    排序前:
    1:User [name=张三, age=25]
    2:User [name=李四, age=20]
    3:User [name=王五, age=30]
    排序后:
    3:User [name=王五, age=30]
    1:User [name=张三, age=25]
    2:User [name=李四, age=20]

  • 相关阅读:
    极大/小搜索,alpha/beta剪枝
    消息系统
    渲染主线程都在干什么
    好玩的虚拟CPU执行代码
    好玩的隐藏属性
    好玩的对象存储
    透视投影矩阵
    绕任意轴旋转
    视图变换
    正交投影矩阵
  • 原文地址:https://www.cnblogs.com/ffeiyang/p/9528073.html
Copyright © 2020-2023  润新知