在Java中如何根据值对HashMap进行排序?

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

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

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

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

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

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

一旦我们按照顺序排列的方式获得值的列表,我们再次根据这个新的列表构建HashMap。

让我们来看一下代码。

HashMap按值排序的简单示例

我们首先将字符串值放入一个列表中,然后对该列表进行排序。

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

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

在我们排序完列表之后,我们根据这个排序好的列表构建 HashMap。

完整的代码如下:

package com.scdev.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}
Values Are Of Type String

HashMap的条目按照字符串值进行排序。

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

如果HashMap中的值是整型(Integer)的话,代码将如下所示:

package com.JournalDev;

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}
Values Are Of Type Integer

这里HashMap的数值按照整数数值排序。

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

如果你注意到上面的例子,Value对象实现了Comparator接口。让我们来看一个我们的值是一个自定义对象的例子。

我们还可以创建一个自定义比较器来根据值对哈希映射进行排序。当值是自定义对象时,这将非常有用。

让我们举一个例子,假设值是一个名为“名称”的类。这个类有两个参数,分别是名字和姓氏。

Name类的代码是:

package com.JournalDev;

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());

我们正在按照名字的顺序来排序,我们也可以使用姓氏来排序。不使用列表来从地图中获取值,我们将使用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
Custom Comparator

结论

本教程介绍了根据值对HashMap进行排序。根据字符串值进行排序与根据整数值进行排序有所不同。字符串值需要使用比较器进行排序。而整数值则直接使用Collection.sort()进行排序。

发表回复 0

Your email address will not be published. Required fields are marked *


广告
将在 10 秒后关闭
bannerAds