【问题标题】:Java stream sorting elements of List<Object> [duplicate]List<Object>的Java流排序元素[重复]
【发布时间】:2020-01-01 12:47:29
【问题描述】:

我目前正在尝试学习 Java 中的流,但是我偶然发现了一个我自己无法解决的问题。给定一个 Person 对象列表,其中包含年龄、身高和姓名属性。我想写一个方法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;
    }
}

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

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

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

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

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

    更新:

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

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

    【讨论】:

    • 非常感谢。你说的对。我刚刚写了 Person 类,当然年龄应该是一个整数。
    • 如果你可以更新问题,那么我也可以更新我的答案。
    • 好收获。让我相应地更新答案。关于高度,它取决于使用的测量单位。例如,如果您使用仪表,则它可以是 double 值。像 1.78 m 的高度。
    • 在这种情况下,您必须使用BigDecimal 类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    相关资源
    最近更新 更多