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 类,其中包含 nameage 属性,我们可以根据 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 对象,包含 salarydepartment 属性:

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 在处理复杂数据结构时具有极大的灵活性,适用于很多不同的应用场景。

正文到此结束
评论插件初始化中...
Loading...