所以我的目标是用1至x部分的y个随机数填充arraty,然后计算每个数字重复多少次并打印出来。 这是代码:
display = !display
我的问题是,如果陈述,它不会显示最后一个数字被重复了多少次,因为它将为计数器加一个而不保存它。我该如何解决?如果您总体上有想法,我该怎么做更好的方法,然后将for + if与array一起使用,继续给我提示。 谢谢您的帮助。
答案 0 :(得分:4)
Map<Integer, Long> map = Arrays.stream(random)
.boxed()
.collect(Collectors.groupingBy(Function.identity(),
Collectors.counting()));
答案 1 :(得分:3)
您需要检查hashMap中是否存在键,如果是,则从该键获取值并以增量更新,否则在哈希图中添加为新键值。
示例;
Map<Integer, Integer> hashMap = new HashMap<>();
for(int i = 0; i < random.length; i++)
if (hashMap.containsKey(random[i])) {
hashMap.put(random[i], (hashMap.get(random[i])+1))
} else {
hashMap.put(random[i], 1)
}
}
现在键将显示您的随机数,其值将显示重复的总数
IntStream
.range(0, random.length)
.forEach(i -> {
hashMap.compute(random[i], (k, v) -> v == null ? 1 : v +1);
});
答案 2 :(得分:3)
使用Java8 +,您可以使用Map.merge
:
Map<Integer, Integer> hashMap = new HashMap<>();
for (int n : random) {
hashMap.merge(n, 1, Integer::sum);
}
其内容如下:对于n
数组中的每个数字random
,将其放入值1
的映射中,如果已经存在,则求和{{ 1}}的值。
答案 3 :(得分:2)
如果您愿意使用带有原始集合的第三方库,则有两种方法可以与Eclipse Collections一起使用。
选项1:使用MutableIntIntMap
MutableIntIntMap map = IntIntMaps.mutable.empty();
Arrays.stream(random).forEach(i -> map.addToValue(i, 1));
map.forEachKeyValue((k, v) ->
System.out.println(k + " duplicate : " + v + " times."));
选项2:使用MutableIntBag
IntBags.mutable.with(random)
.forEachWithOccurrences((i, counter) ->
System.out.println(i + " duplicate : " + counter + " times."));
此blog很好地介绍了Eclipse Collections中的Bag
数据结构。
注意:我是Eclipse集合的提交者
答案 4 :(得分:1)
一种可能的迭代方式是:
IntStream.range(0, length - 1).forEach(i -> {
if (hashMap.containsKey(random[i])) {
int current = hashMap.get(random[i]);
hashMap.put(random[i], current + 1); // increment the count corresponding to the key
} else {
hashMap.put(random[i], 1); // initialise the count from 1
}
});
// print the value and its count
hashMap.forEach((key, value) -> System.out.println(key + " duplicate : " + value + " times."));
答案 5 :(得分:0)
使用toMap
!
Arrays.stream(random).boxed().collect(toMap(Function.identity(), v -> 1, Math::addExact));