IntStream Java的出现次数

前端之家收集整理的这篇文章主要介绍了IntStream Java的出现次数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想定义一个名为countRepeats的方法,它接受一个数字列表0到9,并返回相邻重复字母的出现次数.

例如,

测试用例1:数组{0,1,2,3,1}有三次重复数字

测试用例2:数组{0,2}有一次出现

以下是我的代码

List<Integer> intlist = new ArrayList<Integer>();
        int [] array = new int[]{};
        while(sc.hasNext()){
          intlist.add(sc.nextInt());
          array = intlist.stream().mapToInt(i->i).toArray();  
        }
        System.out.println("Number of occurrences: " + countRepeats(array));

public static long countRepeats(int [] array){
      return IntStream.range(0,array.length-1)
                    .filter(n -> array[n] > 0)
                    .filter(i -> (array[i] == array[i+1]))
                    .peek(System.out::println)
                    .count();
}

但是,我的测试用例2没能得到预期的结果.任何人都可以启发我吗?

解决方法

在原始海报的解决方案的基础上,如果我们检查重复对是否是更大序列的一部分(并检查数组的结尾),那么我们可以避免装箱.
import java.util.*;
import java.util.stream.*;

interface CountRepeats {
    static void main(String[] args) {
        test(0,1);
        test(0,2);
    }
    static void test(int... digits) {
        System.err.println(
            countRepeats(digits)+": "+Arrays.toString(digits)
        );
    }
    static long countRepeats(int[] array) { 
        return IntStream.range(0,array.length-1)
            .filter(i ->
                array[i] == array[i+1] && (
                   i+2 >= array.length ||
                   array[i] != array[i+2]
                )
             )
             .count();
    }
}

这不是溪流的强项.

(线

i+2 >= array.length ||

真的应该

i >= array.length-2 ||

避免导致ArrayOutOfBoundsException的整数溢出.旧语言及其破碎的整数…)

猜你在找的Java相关文章