MST

星途 面试题库

面试题:Java Stream collect生成特定顺序的TreeSet集合

假设有一个自定义类User,包含name(字符串类型)和age(整数类型)属性。现在有一个List<User>,要求使用Stream的collect方法生成一个TreeSet<User>,该TreeSet按照User的age从小到大排序,如果age相同则按照name的字典序排序。请写出具体实现代码,并解释TreeSet的特性对这种实现的影响。
22.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.util.*;
import java.util.stream.Collectors;

class User {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

public class Main {
    public static void main(String[] args) {
        List<User> userList = Arrays.asList(
                new User("Alice", 25),
                new User("Bob", 20),
                new User("Charlie", 25)
        );

        TreeSet<User> treeSet = userList.stream()
               .collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparingInt(User::getAge)
                       .thenComparing(User::getName))));

        treeSet.forEach(user -> System.out.println("Name: " + user.getName() + ", Age: " + user.getAge()));
    }
}

TreeSet的特性对这种实现的影响

  1. 排序特性:TreeSet是基于红黑树实现的,它会对元素进行排序。在上述实现中,我们通过Comparator.comparingInt(User::getAge).thenComparing(User::getName)定义了排序规则,使得TreeSet中的User对象按照age从小到大排序,age相同则按照name的字典序排序。这保证了集合中元素的有序性,符合题目要求。
  2. 唯一性:TreeSet不允许有重复元素。如果有两个User对象的age和name都相同,那么在添加到TreeSet时,第二个相同的对象将不会被添加进去。这种特性保证了集合中元素的唯一性。