有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

列表<对象>的Java流排序元素

我目前正在尝试用Java学习streams,但是我偶然发现了一个我自己无法解决的问题。给定一个Person对象列表,属性为age、height和name。我想写一个方法toString(),它按高度对列表进行排序,如果高度按年龄相等(一切按降序排列)。有没有可能用流来解决这个问题?我知道如何按高度对列表进行排序,但我不明白如何得到相等的元素(相同高度的人)并按年龄对其进行排序

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;
    }
}

数据类(在其中创建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 "";
    }
}

共 (1) 个答案

  1. # 1 楼答案

    您可以使用比较器链接按高度排序,然后按年龄排序。然后使用map操作符映射名称,最后加入收集器将名称连接到您感兴趣的格式化字符串中。这是它的样子

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

    然而,我不认为double是表示一个人年龄的好数据类型。int是一个更好的选择

    更新:

    如果您有int数据类型来表示一个人的年龄,那么比较器链应该如下所示。其他一切都完好无损

    Comparator.comparingDouble(Person::getHeight)
            .thenComparingInt(Person::getAge).reversed()