java - 使用 Collections.frequency() 打印某些值

标签 java collections java-8 java-stream

我有一个数组如下:

int[] array = {11, 14, 17, 11, 48, 33, 29, 11, 17, 22, 11, 48, 18};

我想做的是找到重复的值,然后打印它们。

所以我这样做的方法是转换为 ArrayList,然后转换为 Set 并在 Set< 上使用 stream/.

ArrayList<Integer> list = new ArrayList<>(array.length);
for (int i = 0; i < array.length; i++) {
    list.add(array[i]);
}

Set<Integer> dup = new HashSet<>(list);

然后我使用 stream 循环遍历它并使用 Collections.frequency 打印值。

dup.stream().forEach((key) -> {
            System.out.println(key + ": " + Collections.frequency(list, key));
        });

这当然会全部打印出来,即使计数是一个。

我想添加 if(key > 1) 但这是我想要的值而不是键。

如何获取此实例中的值以仅在 value > 2 处打印。

我可能会输入:

int check = Collections.frequency(list, key);
            if (check > 1) {

但是这会在 stream 中复制 Collections.frequency(list, key) 并且非常丑陋

最佳答案

也许您可以使用 filter 来仅获取大于 2 的值:

dup.stream()
       .filter(t -> Collections.frequency(list, t) > 2)
       .forEach(key -> System.out.println(key + ": " + Collections.frequency(list, key)));

你的结果是:

11: 4

编辑

另一种解决方案:

无需使用 SetCollections.frequency,您只需使用:

Integer[] array = {11, 14, 17, 11, 48, 33, 29, 11, 17, 22, 11, 48, 18};
Arrays.stream(array).collect(Collectors.groupingBy(p -> p, Collectors.counting()))
        .entrySet().stream().filter(t -> t.getValue() > 1)
        .forEach(key -> System.out.println(key.getKey() + ": " + key.getValue()));

输出

48: 2
17: 2
11: 4

关于java - 使用 Collections.frequency() 打印某些值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47353687/

相关文章:

java - 陷入 HashMap Collection 的实现中

c# - 创建空 IQueryable<T> 对象时出现问题

java - '列表<T >' may not contain type objects of type ' 对象'

java - LocalDate - 如何删除 LocalDate 中的字符 'T'

java - 在 Hashmap<Arraylist,Arraylist> 中找到最大值的最佳方法

java - 这两个设置在 Maven 中是否相同?

mysql - grails 3.0.2 mysql 连接

javafx - JavaFX:在实例化 Controller 类时传递参数

java - 在没有 JDK 的情况下在客户端编译代码

java - 如何模拟注入(inject)属性文件值的字符串值?