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

Yog*_*ogi 2 java lambda stream java-8 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;
    }
Run Code Online (Sandbox Code Playgroud)

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

Rav*_*ala 7

首先过滤掉所有相等的值。然后使用布尔键创建一个映射,该映射表示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();
Run Code Online (Sandbox Code Playgroud)