首页 > 解决方案 > 使用 Stream API 根据 JAVA 中的 2 个不同条件将数据流拆分为不同的列表

问题描述

我有一个双打列表(温度)。说:

1.0、2.0、3.0、4.0、......、20.0

我需要编写一个函数countTemperatures(t1,t2,range),它应该打印一个包含两对的列表:1)温度 t1 与区间[t1-r..t1+r]中温度的测量次数配对,2)温度 t2 配对测量区间[t2-r..t2+r]内的温度的次数。

示例:countTemperatures(17.0,10.0,2.0) 应该返回列表 ((17.0,5), (10.0,5)) (因为在 17.0-2.0 (15) 和 17.0+2.0 之间的范围内总共有 5 个测量值( 19). 即 15,16,17,18,19. 同样适用于第二对。

我需要演示 MapReduce(没有任何框架)并且只使用 java 8 流。

我想出了以下内容:

## List<Double> temperature = [1.0, 2.0, 3.0, ......, 20.0]

List<Double> temp = temperature.stream()
                    .collect(Collectors.groupingBy(t -> t>=(t1-r) && t<=(t1+r)));
System.out.println(temp.get(true));

我实际上想获得 2 个列表,其中的值根据上面给出的条件填充。然后想到使用 reduce() 或 count() 来得到答案。但我是 Java 新手,因为我不知道如何进一步进行,所以我一直坚持我的作业这个问题。我对所有视频和不同类型的问题感到困惑。

帮助将不胜感激。

标签: javajava-8java-stream

解决方案


也许你想要这个?


public class Test {
    public static void main(String[] args) {
        List<Double> tmps = new ArrayList<>();
        for (double i = 1.0;i<=20.0;i++){
            tmps.add(i);
        }
        List<Double> param = new ArrayList<>();
        param.add(17.0);
        param.add(10.0);
        param.add(2.0);
        System.out.println(countBykey(param,tmps));
    }

    public static List<List<Double>> countByKey(List<Double> param,List<Double> tmps){
        List<List<Double>> res = new ArrayList<>();
        for (int i = 0;i<2;i++){
            int finalI = i;
            List<Double> e = new ArrayList<>();
            e.add(param.get(finalI));
            e.add((double) (int) tmps.stream().filter(aDouble -> (aDouble >= (param.get(finalI) - param.get(2)) &&
                    (aDouble <= (param.get(finalI) + param.get(2))))).count());
            res.add(e);
        }
        return res;
    }
}

输出:

[[17.0, 5.0], [10.0, 5.0]]

推荐阅读