zoukankan      html  css  js  c++  java
  • 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]

  • 相关阅读:
    LeetCode 242. Valid Anagram (验证变位词)
    LeetCode 205. Isomorphic Strings (同构字符串)
    LeetCode 204. Count Primes (质数的个数)
    LeetCode 202. Happy Number (快乐数字)
    LeetCode 170. Two Sum III
    LeetCode 136. Single Number (落单的数)
    LeetCode 697. Degree of an Array (数组的度)
    LeetCode 695. Max Area of Island (岛的最大区域)
    Spark中的键值对操作
    各种排序算法总结
  • 原文地址:https://www.cnblogs.com/ffeiyang/p/9528073.html
Copyright © 2011-2022 走看看