List<Object> 的 Java 流排序元素

Sil*_*ree -2 java java-8 java-stream

我目前正在尝试使用 Java 学习流,但是我偶然发现了一个我无法自己解决的问题。给定具有Person年龄、高度和名称属性的对象列表。我想编写一个方法toString(),按高度对 List 进行排序,以防高度按年龄相等(所有内容均按降序排列)。有没有可能用流来解决这个问题?我知道如何按高度对 List 进行排序,但是我不明白如何获得相等的元素(具有相同高度的人)并按年龄对它们进行排序。

班级Person

public class Person {
    private int age;
    private double height;
    private String name;

    public Person(int age, double height, String name){
        this.age = age;
        this.height = height;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public double getHeight() {
        return height;
    }

    public String getName() {
        return name;
    }
}
Run Code Online (Sandbox Code Playgroud)

Data 类(在其中创建 toString 方法):

public class Data {
    private List<Person> persons;

    public Data(List<Person> persons){
        this.persons = persons;
    }

    public String toString(){
        //sort the list (persons) and return a String of names

        return "";
    }
}
Run Code Online (Sandbox Code Playgroud)

Rav*_*ala 5

您可以使用 Comparator 链接按高度然后按年龄排序。然后使用map运算符映射名称,最后加入收集器将名称连接成您感兴趣的格式化字符串。这是它的外观。

String sortedNames = persons.stream()
    .sorted(Comparator.comparingDouble(Person::getHeight)
        .thenComparingDouble(Person::getAge).reversed())
    .map(Person::getName)
    .collect(Collectors.joining(", "));
Run Code Online (Sandbox Code Playgroud)

PS 但是,我不认为double代表一个人的年龄是一种很好的数据类型。int 将是一个更好的替代 IMO。

更新:

如果您有int表示一个人年龄的数据类型,那么比较器链应如下所示。其他一切都保持原样。

Comparator.comparingDouble(Person::getHeight)
        .thenComparingInt(Person::getAge).reversed()
Run Code Online (Sandbox Code Playgroud)