gpt4 book ai didi

java - 如何使用 Java 8 流获取最后一个元素值和第一个元素值之间的差异?

转载 作者:行者123 更新时间:2023-11-30 08:34:12 27 4
gpt4 key购买 nike

手头的问题是从一系列时间戳/值数据中返回特定时间间隔内第一个和最后一个已知测量值之间的变化。另外,我想学习使用 Java 8 Streams,所以我想看看这是否以及如何解决问题。

数据样本:

DateTime,Value
...
1470012671,618.59
1470012912,618.62
1470013212,618.65
1470013512,618.68
1470013632,618.69
1470013900,618.71
...

示例输入:

startMillis: 1470012800
endMillis: 1470013800

预期答案(当开始和结束时间不存在时我选择“内部关键值”(参见下面的奖励问题)):

618.69 - 618.62 = 0.07

我目前的代码:

double amountKiloWattHours = 0;
long startMillis = startingTime.toEpochSecond();
long endMillis = startMillis + PERIOD_LENGTH_MILLIS;
try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
// Currently, only returns all pairs within range...
Stream<Pair> pairs = stream
.skip(1)
.map(p -> {
return new Pair(p);
})
.filter(pair -> {
return (pair.getMillis() > startMillis) && (pair.getMillis() < endMillis);
});
} catch (Exception e) {
// TODO specify and handle exceptions...
}

.

public class Pair {
@Getter
private final long millis;
@Getter
private final double kWhs;

public Pair(String input) {
String[] parts = input.split(",");
this.millis = Long.parseLong(parts[0]);
this.kWhs = Double.parseDouble(parts[1]);
}
}

我现在如何获得间隔中最后一对和第一对的值之间的差异?

奖励问题:如何在两个周围值之间线性插值精确时间戳值的情况下获得插值结果?

最佳答案

没有现成的收集器可以同时找到最大和最小元素,但您可以使用我在 this answer 中编写的 pairing 收集器(在我的 StreamEx 库中很容易获得——参见 JavaDoc ):

Comparator<Pair> cmp = Comparator.comparingLong(Pair::getMillis);

double diff = stream
.skip(1)
.map(Pair::new)
.filter(pair -> (pair.getMillis() > startMillis) && (pair.getMillis() < endMillis))
.collect(pairing(Collectors.maxBy(cmp), Collectors.minBy(cmp),
(maxPair, minPair) -> maxPair.get().getKWhs() - minPair.get().getKWhs()));

这不会收集不必要的数据:您只会提取最小行和最大行。

注意:此代码假定您至少有一个 Pair(即范围内的一个时间戳/值实例,不一定是不同的最小和最大时间戳/值)满足条件。如果你想专门处理没有这样一对的情况(比如返回0),你应该修改代码(比如这样:maxPair.map(Pair::getKWhs).orElse(0d ) - minPair.map(Pair::getKWhs).orElse(0d)).

关于java - 如何使用 Java 8 流获取最后一个元素值和第一个元素值之间的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38979306/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com