是否可以使用Java来查找数值集合的中值?我有一个List<Double>类型的变量,它是未排序的。
从JDK9到14的javadocs似乎表明median()不是DoubleStream的有效方法。但是,平均值、最小值、最大值、计数和和是有效的聚合函数。
median()不是一个有效的方法,因为它在流之前需要一个已排序的集合?
这在average()中运行得很好:
// Function to find average element from a List of Integers in Java 9 and above
public static Double getAverageWithStream(List<Double> list) {
OptionalDouble average = list.stream() // Stream<Double>
.mapToDouble(v -> v) // DoubleStream
.average(); // OptionalDouble
// Print out a message about the 'average' variable's value
// Note: ifPresentOrElse() was introduced in JDK9
average.ifPresentOrElse(
// message the value if one exists
(value) -> {
System.out.println("The average value is " + value);
},
// Alert the user that there is no value
() -> {
System.out.println("No average could be determined!");
}
); // end ifPresentOrElse()
return average.orElse(Double.NaN);
} // end getAverageWithStream()发布于 2020-05-09 19:25:52
根据@Robert留下的评论,需要以以下方式更改我的方法,以支持中值聚合:
/**
* Function to find median element from a List of Integers in Java 9 and above
* @param list List<Double>
* @return Double
*/
public static Double getMedianWithStream(List<Double> list) {
DoubleStream sortedNumbers = list.stream() // Stream<Double>
.mapToDouble(v -> v) // DoubleStream
.sorted(); // DoubleStream sorted
OptionalDouble median = (
list.size() % 2 == 0 ?
sortedNumbers.skip((list.size() / 2) - 1)
.limit(2)
.average() :
sortedNumbers.skip(list.size() / 2)
.findFirst()
);
// Print out a message about the 'average' variable's value
// Note: ifPresentOrElse() was introduced in JDK9
median.ifPresentOrElse(
// message the value if one exists
(value) -> {
System.out.println("The median value is " + value);
},
// Alert the user that there is no value
() -> {
System.out.println("No median could be determined!");
}
); // end ifPresentOrElse()
return median.orElse(Double.NaN);
} // end getAverageWithStream()发布于 2020-05-09 19:17:28
没有中位数(),您必须自己滚动,不过我认为,考虑到排序的性质,排序是必需的。
如果您使用的是中位数(而不是平均值)的数学定义,那么只需找到排序列表的中间部分:
mylist.sort()
int median = mylist[list.size/2]但是,您需要将您的流转换成一个列表来完成这个任务,这可能不是您想要的。
https://stackoverflow.com/questions/61702154
复制相似问题