如何在Java中按值对HashMap排序?

时间:2020-02-23 14:34:42  来源:igfitidea点击:

Java中的HashMap提供了快速查找。
它们以"键,值"对存储项目。
要从HashMap获取值,我们使用与该条目对应的键。

HashMaps是实现字典和目录的好方法。

键和值可以具有不同的类型(例如,字符串,整数)。

我们可以根据键和值对HashMap中的条目进行排序。

在本教程中,我们将根据值对HashMap进行排序。

基本策略是从列表中的HashMap中获取值并对列表进行排序。
其中如果Value的数据类型为String,则使用比较器对列表进行排序。
要了解有关比较器的更多信息,请阅读本教程。

一旦获得排序后的值列表,我们将基于此新列表再次构建HashMap。

让我们看一下代码。

按值对HashMap进行排序的简单示例

我们首先在列表中获取String值。
然后,我们对列表进行排序。

为了对列表中的字符串值进行排序,我们使用了一个比较器。
该比较器按字母顺序对值列表进行排序。

Collections.sort(list, new Comparator<String>() {
          public int compare(String str, String str1) {
              return (str).compareTo(str1);
          }
      });

一旦我们对列表进行了排序,就可以基于此排序列表构建HashMap。

完整的代码如下:

package com.theitroad.collections;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;

public class Main {
  public static void main(String[] args) {
      HashMap<String, String> map = new HashMap<>();
      LinkedHashMap<String, String> sortedMap = new LinkedHashMap<>();
      ArrayList<String> list = new ArrayList<>();
      map.put("2", "B");
      map.put("8", "A");
      map.put("4", "D");
      map.put("7", "F");
      map.put("6", "W");
      map.put("19", "J");
      map.put("1", "Z");
      for (Map.Entry<String, String> entry : map.entrySet()) {
          list.add(entry.getValue());
      }
      Collections.sort(list, new Comparator<String>() {
          public int compare(String str, String str1) {
              return (str).compareTo(str1);
          }
      });
      for (String str : list) {
          for (Entry<String, String> entry : map.entrySet()) {
              if (entry.getValue().equals(str)) {
                  sortedMap.put(entry.getKey(), str);
              }
          }
      }
      System.out.println(sortedMap);
  }
}

输出:

{8=A, 5=B, 3=D, 7=F, 10=J, 2=W, 1=Z}

值是字符串类型

HashMap条目根据String值排序。

按值对HashMap排序的另一个示例

如果HashMap中的值是Integer类型,则代码如下:

package com.theitroad;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;

public class Main {
  public static void main(String[] args) {
      HashMap<String, Integer> map = new HashMap<>();
      LinkedHashMap<String, Integer> sortedMap = new LinkedHashMap<>();
      ArrayList<Integer> list = new ArrayList<>();
      map.put("A", 5);
      map.put("B", 7);
      map.put("C", 3);
      map.put("D", 1);
      map.put("E", 2);
      map.put("F", 8);
      map.put("G", 4);
      for (Map.Entry<String, Integer> entry : map.entrySet()) {
          list.add(entry.getValue());
      }
      Collections.sort(list); 
      for (int num : list) {
          for (Entry<String, Integer> entry : map.entrySet()) {
              if (entry.getValue().equals(num)) {
                  sortedMap.put(entry.getKey(), num);
              }
          }
      }
      System.out.println(sortedMap);
  }
}

输出:

{D=1, E=2, C=3, G=4, A=5, B=7, F=8}

其中HashMap值根据Integer值排序。

使用自定义比较器对HashMap排序

如果您注意到上述示例,则Value对象将实现Comparator接口。
让我们看一个示例,其中我们的值是一个自定义对象。

我们还可以创建一个自定义比较器,以根据值对哈希图进行排序。
当您的值是自定义对象时,这很有用。

让我们举一个例子,其中value是一个名为" Name"的类。
此类具有两个参数,firstName和lastName。

名称类的代码是:

package com.theitroad;

public class Name {
 String firstName;
 String lastName;
 Name(String a, String b){
     firstName=a;
     lastName=b;

 }
  public String getFirstName() {
      return firstName;
  }

}

自定义比较器如下所示:

Comparator<Name> byName = (Name obj1, Name obj2) -> obj1.getFirstName().compareTo(obj2.getFirstName());

我们根据名字对名字进行排序,我们也可以使用lastName进行排序。
我们将使用LinkedHashMap直接创建排序后的哈希图,而不是使用列表从地图中获取值。

完整的代码是:

public static void main(String[] args) {
      HashMap<Integer, Name> hmap = new HashMap<Integer, Name>();
      Name name1 = new Name("Jayant", "Verma");
      Name name2 = new Name("Ajay", "Gupta");
      Name name3 = new Name("Mohan", "Sharma");
      Name name4 = new Name("Rahul", "Dev");

      hmap.put(9, name1);
      hmap.put(1, name2);
      hmap.put(6, name3);
      hmap.put(55, name4);

      Comparator<Name> byName = (Name obj1, Name obj2) -> obj1.getFirstName().compareTo(obj2.getFirstName());

      LinkedHashMap<Integer, Name> sortedMap = hmap.entrySet().stream()
              .sorted(Map.Entry.<Integer, Name>comparingByValue(byName))
              .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
      
//printing the sorted hashmap 
      Set set = sortedMap.entrySet();
      Iterator iterator = set.iterator();
      while (iterator.hasNext()) {
          Map.Entry me2 = (Map.Entry) iterator.next();
          System.out.print(me2.getKey() + ": ");
       System.out.println(hmap.get(me2.getKey()).firstName + " "+hmap.get(me2.getKey()).lastName );
        
      }
  }

输出:

1: Ajay Gupta
9: Jayant Verma
6: Mohan Sharma
55: Rahul Dev