我想定义一个名为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的整数溢出.旧语言及其破碎的整数…)