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)
您可以使用 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)