Java 排序用法大全:按照 Key 或者 Value 排序、Key 和 Value 对象的属性排序
Java 排序用法大全:按照 Key 或者 Value 排序、Key 和 Value 对象的属性排序
在 Java 中,TreeMap 是一个非常强大的有序映射实现,它默认会按照键的自然顺序(或者自定义排序规则)进行排序。在某些情况下,我们可能需要对 TreeMap 中的键、值,或者键值对的属性进行排序。本文将详细介绍如何实现这些排序,帮助你更高效地使用 TreeMap。
1. 按照 Key 排序
TreeMap 默认情况下会按照键的自然顺序进行排序。如果你希望自定义排序规则,可以通过传入 Comparator 来实现。
1.1 默认按 Key 排序(升序)
import java.util.*;
public class TreeMapSortByKey {
public static void main(String[] args) {
TreeMap<Integer, String> map = new TreeMap<>();
map.put(3, "Three");
map.put(1, "One");
map.put(2, "Two");
System.out.println(map); // 输出:{1=One, 2=Two, 3=Three}
}
}
上述代码展示了默认的升序排序。
1.2 自定义按 Key 排序(降序)
你可以使用 Comparator 来对键进行自定义排序。以下示例展示了如何将键按照降序排序:
import java.util.*;
public class TreeMapSortByKeyDesc {
public static void main(String[] args) {
TreeMap<Integer, String> map = new TreeMap<>(Collections.reverseOrder());
map.put(3, "Three");
map.put(1, "One");
map.put(2, "Two");
System.out.println(map); // 输出:{3=Three, 2=Two, 1=One}
}
}
2. 按照 Value 排序
TreeMap 默认是根据键进行排序的,如果你需要根据值进行排序,则需要通过一些技巧,比如将 TreeMap 转换为 List 进行排序。
2.1 按照 Value 排序(升序)
我们可以先将 TreeMap 的条目转换为 List,然后使用 Comparator 按照值排序。
import java.util.*;
public class TreeMapSortByValue {
public static void main(String[] args) {
TreeMap<String, Integer> map = new TreeMap<>();
map.put("apple", 10);
map.put("banana", 5);
map.put("cherry", 8);
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
// 按照 Value 排序
list.sort(Map.Entry.comparingByValue());
System.out.println(list); // 输出:[banana=5, cherry=8, apple=10]
}
}
2.2 按照 Value 排序(降序)
若需要按照值的降序排序,可以使用 Collections.reverseOrder() 来实现:
import java.util.*;
public class TreeMapSortByValueDesc {
public static void main(String[] args) {
TreeMap<String, Integer> map = new TreeMap<>();
map.put("apple", 10);
map.put("banana", 5);
map.put("cherry", 8);
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
// 按照 Value 降序排序
list.sort((entry1, entry2) -> entry2.getValue().compareTo(entry1.getValue()));
System.out.println(list); // 输出:[apple=10, cherry=8, banana=5]
}
}
3. 按照 Key 和 Value 对象的属性排序
有时我们不仅需要排序键和值,还需要根据键或值所包含的对象的属性进行排序。以下将展示如何对对象进行排序。
3.1 按照 Key 对象的属性排序
假设 TreeMap 的键是一个对象,而不是基本数据类型,我们可以通过自定义排序规则来对对象的属性进行排序。
假设有一个 Person 类,其中包含 name 和 age 属性,我们可以根据 age 属性对 Person 对象进行排序:
import java.util.*;
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name + ":" + age;
}
}
public class TreeMapSortByKeyObject {
public static void main(String[] args) {
TreeMap<Person, String> map = new TreeMap<>(Comparator.comparingInt(p -> p.age));
map.put(new Person("Alice", 25), "Student");
map.put(new Person("Bob", 30), "Engineer");
map.put(new Person("Charlie", 20), "Artist");
System.out.println(map); // 输出:{Charlie:20=Artist, Alice:25=Student, Bob:30=Engineer}
}
}
在这个示例中,TreeMap 根据 Person 对象的 age 属性进行升序排序。
3.2 按照 Value 对象的属性排序
如果 TreeMap 的值是一个对象类型,我们可以通过自定义 Comparator 对其属性进行排序。
假设值是一个 Employee 对象,包含 salary 和 department 属性:
import java.util.*;
class Employee {
String department;
double salary;
Employee(String department, double salary) {
this.department = department;
this.salary = salary;
}
@Override
public String toString() {
return department + ": " + salary;
}
}
public class TreeMapSortByValueObject {
public static void main(String[] args) {
TreeMap<String, Employee> map = new TreeMap<>();
map.put("E1", new Employee("HR", 50000));
map.put("E2", new Employee("IT", 70000));
map.put("E3", new Employee("Finance", 60000));
List<Map.Entry<String, Employee>> list = new ArrayList<>(map.entrySet());
// 按照 Value 的 salary 排序
list.sort((entry1, entry2) -> Double.compare(entry1.getValue().salary, entry2.getValue().salary));
System.out.println(list); // 输出:[E1=HR: 50000.0, E3=Finance: 60000.0, E2=IT: 70000.0]
}
}
在这个示例中,TreeMap 根据 Employee 对象的 salary 属性进行升序排序。
4. 总结
TreeMap默认会按照键的自然顺序进行排序,但我们可以通过Comparator实现自定义排序。- 可以将
TreeMap转换为List,然后对值进行排序。 - 通过自定义
Comparator,可以根据对象的属性对键和值进行排序。
这些技术使得 TreeMap 在处理复杂数据结构时具有极大的灵活性,适用于很多不同的应用场景。