首页 > 解决方案 > 使用java8过滤器比较两个整数列表

问题描述

我有一个问题如下。有两个大小相等的整数列表 a 和 b。现在我想比较同一索引处的两个列表值。我的函数返回具有 2 个值的列表。第一个值是列表 a 中较大值的计数。第二个值是列表 b 中较大值的计数。如果两者具有相同的值,则计数没有增加。

我可以知道如何使用流/过滤器/谓词在 java8 中实现它吗

我在较旧的 java 版本中重新运行了该方法。

    static List<Integer> compareTriplets(List<Integer> a, List<Integer> b) {
        List<Integer> list = new ArrayList<Integer>();
        int asize = 0;
        int bsize = 0;
        for (int i = 0; i <b.size();i++) {
            if(a.get(i) > b.get(i)) {
                asize++;
            }else if(a.get(i) < b.get(i)) {
                bsize++;
            }
        }
        list.add(asize);
        list.add(bsize);
        return list;
    }

例如1。输入:a =5 6 7 b = 3 6 10 输出:1 1 例如 2。输入:a = 17 28 30 b = 99 16 8 输出:2 1

标签: javalambdajava-8streamjava-stream

解决方案


首先过滤掉所有相等的值。然后创建一个带有布尔键的映射,表示 in 中的给定值a是小于还是大于 in 中的对应值b。最后使用计数收集器获取每个类别的计数。这是它的外观。

Collection<Long> gtAndLtCount = IntStream.range(0, a.size())
    .filter(i -> a.get(i) != b.get(i)).boxed()
    .collect(Collectors.partitioningBy(i -> a.get(i) < b.get(i), Collectors.counting()))
    .values();

推荐阅读