如何按值对 Java 映射进行排序

原文:https://www.studytonight.com/java-examples/how-to-sort-a-java-map-by-value

在本文中,我们将学习对 Java 映射的元素进行排序。Java 中的 Map 默认情况下是未排序的,以键值格式存储数据。非常需要根据价值对它们进行排序,以便根据价值做出决策。

示例:对映射排序

这里,我们有一个学生映射的例子,他们的名字和身高以厘米为单位。假设我们想根据学生的名字对他们进行排序(基于键进行编程),为此我们将使用Collections.sort()方法,同样的方法也可以用于根据他们的身高对学生进行排序(基于值进行编程),但唯一需要的更改是Comparator函数。

Collections.sort()总是以一个List<T>作为参数。因此,我们将从Map.entrySet()这个方法创建一个列表,它将返回映射的所有键值对。当根据多个参数对特定集合进行排序时,Comparator功能开始发挥作用。在Comparator功能内部,return student1.getKey().compareTo(student2.getKey()); 决定排序方式。在这种情况下,它将根据关键字进行排序。

import java.util.*;
public class StudyTonight
{
    public static void main(String args[])
    {
        Map<String,Integer> students = new HashMap<>();            

        students.put("Student 1", 159);
        students.put("Student 2", 147);
        students.put("Student 3", 183);
        students.put("Student 4", 167);
        students.put("Student 5", 173);

        List<Map.Entry<String, Integer>> student_list = new ArrayList<>(students.entrySet());

        System.out.println("\nBefore Sorting\n");
        for(Map.Entry<String, Integer> student: student_list)
        {
            System.out.println(student.getKey()+" "+student.getValue());
        }

        Collections.sort(student_list, new Comparator<Map.Entry<String, Integer>>()
        {
            @Override
            public int compare(Map.Entry<String, Integer> student1, Map.Entry<String, Integer> student2){
                return student1.getKey().compareTo(student2.getKey());
            }
        });

        System.out.println("\nAfter Sorting\n");
        for(Map.Entry<String, Integer> student: student_list)
        {
            System.out.println(student.getKey()+" "+student.getValue());
        }             

    }
}

排序前 学生 2 147 学生 1 159 学生 4 167 学生 3 183 学生 5 173 排序后 学生 1 159 学生 2 147 学生 3 183 学生 4 167 学生 5 173

基于值对映射进行排序的示例

要根据值对映射进行排序,我们只需更改Comparator功能student1.getValue().compareTo(student2.getValue());,其余代码将保持不变。

enlightened这里Comparator函数处理的是 Map 的值,因此我们将根据值得到结果。

import java.util.*;
public class StudyTonight
{
    public static void main(String args[])
    {
        Map<String,Integer> students = new HashMap<>();            

        students.put("Student 1", 159);
        students.put("Student 2", 147);
        students.put("Student 3", 183);
        students.put("Student 4", 167);
        students.put("Student 5", 173);

        List<Map.Entry<String, Integer>> student_list = new ArrayList<>(students.entrySet());

        System.out.println("\nBefore Sorting\n");
        for(Map.Entry<String, Integer> student: student_list)
        {
            System.out.println(student.getKey()+" "+student.getValue());
        }

        Collections.sort(student_list, new Comparator<Map.Entry<String, Integer>>()
        {
            @Override
            public int compare(Map.Entry<String, Integer> student1, Map.Entry<String, Integer> student2){
                return student1.getValue().compareTo(student2.getValue());
            }
        });

        System.out.println("\nAfter Sorting\n");
        for(Map.Entry<String, Integer> student: student_list)
        {
            System.out.println(student.getKey()+" "+student.getValue());
        }             

    }
}

排序前 学生 2 147 学生 1 159 学生 4 167 学生 3 183 学生 5 173 排序后 学生 2 147 学生 1 159 学生 4 167 学生 5 173 学生 3 183

使用λ和基于值对映射进行排序的示例

这个方法也与我们在第一个例子中所做的非常相似。但是,唯一不同的是Comparator函数,它被称为匿名实现(student1, student2)->student1.getKey().compareTo(student2.getKey()));

import java.util.*;
public class StudyTonight
{

    public static void main(String args[])
    {
        Map<String,Integer> students = new HashMap<>();            

        students.put("Student 1", 159);
        students.put("Student 2", 147);
        students.put("Student 3", 183);
        students.put("Student 4", 167);
        students.put("Student 5", 173);

        List<Map.Entry<String, Integer>> student_list = new ArrayList<>(students.entrySet());

        System.out.println("\nBefore Sorting\n");
        for(Map.Entry<String, Integer> student: student_list)
        {
            System.out.println(student.getKey()+" "+student.getValue());
        }

        Collections.sort(student_list, (student1, student2)->student1.getKey().compareTo(student2.getKey())); 

        System.out.println("\nAfter Sorting\n");
        for(Map.Entry<String, Integer> student: student_list)
        {
            System.out.println(student.getKey()+" "+student.getValue());
        }             

    }
}

排序前 学生 2 147 学生 1 159 学生 4 167 学生 3 183 学生 5 173 排序后 学生 1 159 学生 2 147 学生 3 183 学生 4 167 学生 5 173

结论:

我们可以借助Comparator函数,使用Collection.sort()方法对 Java 中的 Map 进行排序。Comparator功能可以匿名方式实现,效率更高。