MST

星途 面试题库

面试题:Java中TreeMap如何按自定义规则排序

在Java中,已知有一个TreeMap,存储了若干自定义类的对象,该自定义类包含两个属性:name(字符串类型)和age(整数类型)。现在要求按照age从大到小排序,如果age相同则按照name的字典序从小到大排序,请描述实现思路并给出关键代码。
25.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 实现思路
    • 自定义类需要实现Comparable接口,重写compareTo方法来定义排序规则。
    • compareTo方法中,先比较age,如果age不同,按age从大到小排序;如果age相同,按name的字典序从小到大排序。
    • 将自定义类的对象存入TreeMap时,TreeMap会根据自定义类实现的Comparable接口的排序规则自动排序。
  2. 关键代码
import java.util.TreeMap;

class CustomClass implements Comparable<CustomClass> {
    private String name;
    private int age;

    public CustomClass(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(CustomClass other) {
        // 先按age从大到小排序
        if (this.age != other.age) {
            return other.age - this.age;
        } else {
            // age相同时按name字典序从小到大排序
            return this.name.compareTo(other.name);
        }
    }

    // 生成getter和setter方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

public class Main {
    public static void main(String[] args) {
        TreeMap<CustomClass, Integer> treeMap = new TreeMap<>();
        // 假设这里添加一些自定义类的对象
        treeMap.put(new CustomClass("Alice", 25), 1);
        treeMap.put(new CustomClass("Bob", 20), 2);
        treeMap.put(new CustomClass("Alice", 20), 3);

        // 遍历treeMap,会按定义的规则排序
        for (CustomClass key : treeMap.keySet()) {
            System.out.println("Name: " + key.getName() + ", Age: " + key.getAge());
        }
    }
}