【发布时间】:2019-08-21 09:07:30
【问题描述】:
我的目标是能够计算数组中相同整数的组。例如,在这样的数组中,{1, 1, 1, 2, 2, 3, 1, 1},有 4 个组:
- 至少大小为 1:3 组
- 至少大小为 2:1 组
- 至少大小为 3
我在没有对数组进行排序的情况下完成此操作时遇到了问题。当它被排序时,我失去了数组末尾的两个 1 组的计数,因为它被放在其他 1 组旁边。
int result = (int) Stream.of(1, 1, 1, 2, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 4, 4, 4, 6)
.collect(Collectors.groupingBy(i -> i))
.entrySet().stream()
.filter(entry -> entry.getValue().size() >= 1) // specify the size
.count()
return result;
每种尺寸的预期输出如下:
size 1 count == 8
size 2 count == 5
size 6 count == 1
size 8 count == 1
实际输出如下:
size 1 count == 6
size 2 count == 3
size 6 count == 2
size 8 count == 1
差异是数组在计数之前排序的结果。有没有办法做到这一点?
编辑: 组本质上是相同整数重复的任何地方,直到一个不同值的整数在它前面;因此,此代码中大小为 2 的组是索引 0 到 2(包括)、索引 4 - 5(包括)、索引 6 - 15(包括)、索引 16 - 18(包括)和索引 20 -22 的任何组(含)。由于有 5 个组的大小至少为 2,因此应返回 5 个计数。
为了我的目标而编写的命令式代码。
Scanner key = new Scanner("1 1 1 2 1 1 3 3 3 3 3 3 3 3 3 3 4 4 4 5 4 4 4 6");
int cnt = 0;
int counter = 0;
int i = 0;
while(key.hasNextInt()) {
int next = key.nextInt();
if(next == array[i]) {
counter++;
}
if(i + 1 < array.length && i -1 >= 0
&& counter >=size
&& next != array[i + 1]
&& next == array[i-size + 1]) {
cnt++;
counter = 0;
}
i++;
}
return cnt;
此操作的预期回报与上述相同。
实际回报为:
size 1 count == 7
size 2 count == 5
size 6 count == 3
size 8 count == 1
这个循环的问题是我相信它跳过了数组的第一部分和结束部分。
我没有遇到与 Stream 方式相同的排序问题。
理想情况下,这不需要任何外部实用程序/库。
【问题讨论】:
-
您能否解释一下,根据提供的输入,
size 1 count == 8是怎样的?您能否也定义组并分享循环代码的命令式风格来解释您打算做什么? -
已进行更改以使其更加清晰。感谢您的回复。
标签: java arrays java-stream counting