我想定义一个名为 countRepeats 的方法,它接受一个数字列表 0 到 9 并返回相邻重复字母的出现次数。
例如,
测试用例1:数组{0, 1, 2, 2, 1, 2, 2, 1, 3, 3, 1}出现3次重复数字
测试用例2:数组{0, 1, 1, 1, 1, 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, 2, 2, 1, 2, 2, 1, 3, 3, 1);
test(0, 1, 1, 1, 1, 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
。古老的语言和它们 splinter 的整数……)
关于java - IntStream Java 出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52742944/