可以用批量“ Collection.addAll”替换迭代

时间:2018-11-30 19:32:13

标签: java arrays hashmap duplicates

所以我的目标是用1至x部分的y个随机数填充arraty,然后计算每个数字重复多少次并打印出来。 这是代码:

display = !display

我的问题是,如果陈述,它不会显示最后一个数字被重复了多少次,因为它将为计数器加一个而不保存它。我该如何解决?如果您总体上有想法,我该怎么做更好的方法,然后将for + if与array一起使用,继续给我提示。 谢谢您的帮助。

6 个答案:

答案 0 :(得分:4)

Map<Integer, Long> map = Arrays.stream(random)
                .boxed()
                .collect(Collectors.groupingBy(Function.identity(),
                                               Collectors.counting()));

答案 1 :(得分:3)

您需要检查hashMap中是否存在键,如果是,则从该键获取值并以增量更新,否则在哈希图中添加为新键值。

在Java8之前

示例;

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)
    }
}

现在键将显示您的随机数,其值将显示重复的总数

使用Java8

    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));