如何按值对 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());
,其余代码将保持不变。
这里
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
功能可以匿名方式实现,效率更高。