当前位置: 首页 > 知识库问答 >
问题:

如何使用Java8流获得最后一个元素和第一个元素的值之间的差异?

乐山
2023-03-14
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]);
    }
}

额外的问题:我如何得到插值的结果,其中确切的时间戳的值是线性插值之间的两个周围的值?

共有1个答案

惠凯歌
2023-03-14

没有现成的收集器可以同时找到最大和最小元素,但是您可以使用我在本答案中编写的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()));

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

注意:此代码假设至少有一个(即范围内有一个时间戳/值实例,不一定同时有不同的最小时间戳/值和最大时间戳/值)满足条件。如果您想特别处理没有这样的对的情况(例如,返回0),您应该修改代码(例如,像这样:maxpair.map(pair::getKWHs).orelse(0d)-minpair.map(pair::getKWHs).orelse(0d))。

 类似资料:
  • 本文向大家介绍JavaScript数组中的第一个元素和最后一个元素?,包括了JavaScript数组中的第一个元素和最后一个元素?的使用技巧和注意事项,需要的朋友参考一下 数组是一组元素。每个元素都有其自己的 索引值。我们可以使用这些索引访问任何元素。但是,对于最后一个元素,直到知道数组中存在的元素数量,我们才知道索引。在这种情况下,我们必须使用逻辑。让我们简要地讨论这些细节。 访问第一个元素 因

  • 问题内容: 提取切片的最后一个元素的Go方法是什么? 上面的解决方案有效,但看起来很尴尬。 问题答案: 仅读取切片的最后一个元素: 要删除它: 参见此页面有关切片技巧

  • 我有一个列表[z”,“1”,“3”,“x”,“y”,“00”,“x”,“y”,“4”],在这种情况下,我需要得到字符串后的第一个

  • 问题内容: 我在页面上有以下HTML代码: 在我中,我有以下选择器来设置元素的样式。上面的HTML代码只是整个代码的一小部分;有更多的包裹属于一个shadowbox: 因此,我的元素样式正确,但是我也想在HTML中设置标签样式。 CSS选择器可能吗?如果是的话,我该怎么做? 问题答案: 这称为相邻的兄弟选择器。

  • 我对流完全陌生,目前正在尝试解决这个任务,我有以下两个列表:

  • 本文向大家介绍Python中如何获得列表的最后一个元素,包括了Python中如何获得列表的最后一个元素的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将看到从列表中获取最后一个元素的不同方法。让我们一一看。 使用索引值 我们可以使用索引获取列表的最后一个元素。我们可以通过列表的长度来获取最后一个元素的索引。让我们看一下代码。 示例 输出结果 如果执行上述程序,则将得到以下结果。 使用负索