使用Java8过滤器比较两个Integer列表

时间:2019-07-18 10:56:33

标签: java lambda java-8 stream java-stream

我有以下问题。有两个大小相等的整数列表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

1 个答案:

答案 0 :(得分:6)

首先过滤掉所有相等的值。然后使用布尔键创建一个映射,该映射表示a中的给定值是小于还是大于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();
相关问题