java - 使用 Java 8 从对象列表中查找中值

标签 java list java-8 median

我有两个结构如下的类:

public class Company {
     private List<Person> person;
     ...
     public List<Person> getPerson() {
          return person;
     }
     ...
}

public class Person {
     private Double age;
     ...
     public Double getAge() {
          return age;
     }
     ...
}

基本上 Company 类有一个 Person 对象列表,每个 Person 对象可以获得一个 Age 值。

如果我得到 Person 对象的列表,是否有一种好方法可以使用 Java 8 在所有 Person 对象中找到年龄中值(Stream 不支持中值,但还有其他任何东西)?

Double medianAge;
if(!company.getPerson().isEmpty) {
     medianAge = company.getPerson() //How to do this in Java 8?
}

最佳答案

你可以使用

List<Person> list = company.getPerson();
DoubleStream sortedAges = list.stream().mapToDouble(Person::getAge).sorted();
double median = list.size()%2 == 0?
    sortedAges.skip(list.size()/2-1).limit(2).average().getAsDouble():        
    sortedAges.skip(list.size()/2).findFirst().getAsDouble();

这种方法的优点是它不修改列表,因此也不依赖于它的可变性。但是,这不一定是最简单的解决方案。

如果你有修改列表的选项,你可以使用

List<Person> list = company.getPerson();
list.sort(Comparator.comparingDouble(Person::getAge));
double median = list.get(list.size()/2).getAge();
if(list.size()%2 == 0) median = (median + list.get(list.size()/2-1).getAge()) / 2;

相反。

关于java - 使用 Java 8 从对象列表中查找中值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43667989/

相关文章:

python - 从排列中清理元组列表

for循环中的Python列表初始化

java - 防止 "Null Byte Attacks"| java

java - 使用 Java API 的维度 0 的切片索引 0 超出范围

java - Redis/Jedis - 按模式删除?

java - java中变量的初始化

c# - List<T>.IndexOf() 与 List<T>.FindIndex() 的效率

java - 如何使用流合并 map 集合

postgresql - 使用 postgres 表序列而不是共享 hibernate_sequence

java-8 - 如何在 CentOS 中选择给定的 JDK