繁体   English   中英

使用基于字段的流计算 Java 8 中的重复项

[英]Count Duplicates in Java 8 using Streams Based on Field

我正在尝试计算从 Item 对象列表中复制了多少项。 如果项目具有相同的 id,则项目是重复的。

例如

[5, 5, 2, 4, 2]

id 5 和 2 都出现不止一次,所以答案是 2。


public class Item {

    int id;

    public Item(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }
}

public class DuplicateItems {

    public static int count(List<Item> items) {
        int count = 0;
        if (items.size() == 0) {
            return 0;
        }

        items.sort(Comparator.comparingInt(Item::getId));
        Map<Object, Long> resultMap = new HashMap<>();
        items.forEach(e -> resultMap.put(e, resultMap.getOrDefault(e, 0L) + 1L));
        System.out.println(resultMap.size());
        return count;
    }

    private static List<Items> convertToList(int[] values) {
        List<Item> items = new ArrayList<>();
        for (int num : values) {
            items.add(new Item(num));
        }
        return items;
    }

    public static void main(String[] args) {
        int[] itemsArray = {5, 5, 2, 4, 2};
        List<Item> items = convertToList(itemsArray);
        int duplicateCount = count(items);
        System.out.println("Duplicate Count: " + duplicateCount);
    }
}

当我运行程序时,它说:

Duplicate Count: 5

为什么值不是 2?

这会将它们放在基于频率的映射中,然后计算大于 1 的值的数量。

       long dups = list2.stream()
       .collect(Collectors.groupingBy(Item::getId, Collectors.counting()))
               .values().stream().filter(i-> i > 1).count();

       System.out.println(dups);

您正在执行许多误导或错误的步骤,为什么不简单地:

items.stream()
     .map(Item::getId)
     .collect(Collectors.groupingBy(
         Function.identity(),
         Collectors.counting()
     ))
     .values()
     .stream()
     .filter(x -> x > 1)
     .count();

即:首先收集到Map ,然后只计算那些> 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM