java - 在 Java 中按多个属性对对象进行分组的一般方法

标签 java algorithm list collections grouping

我有一个项目集合:

class Item {        
    String type;
    boolean flag;
    int size;
    ...
}

有几种可能的类型(比如“a”、“b”和“c”),因此有几种可能的类型标志值组合(["a"; false], ["a"; true"], ["b"; false], ... )。我需要折叠具有相同值组合的项目,所以我有带有此签名的 collapse 方法

Item collapse(Collection<Item> items)

我需要的是将输入项列表分成具有相同typeflag 值的组

List<Collection<Item>> getGroups(Collection<Item> items) // method I need

所以我可以折叠每个组

List<Item> r = getGroups(items).stream().map(Item::collapse).collect(toList());

所以我可以创建一个 map 的 map 或制作一些复合键,但它需要一些我想避免的样板代码。将来我可以有更多的分组属性,所以解决方案不应该在这两个属性上进行硬编码,而是可以很容易地扩展到新的属性。

如何才能很好地做到这一点?该问题是否有众所周知的解决方案?

最佳答案

您可以使用 Collectors.groupingBy :

public static void main(String[] args) {
    List<Item> list = new ArrayList<>();
    list.add(new Item(1, true, 1));
    list.add(new Item(1, true, 2));

    list.add(new Item(1, false, 3));
    list.add(new Item(1, false, 4));

    list.add(new Item(2, true, 5));
    list.add(new Item(2, false, 6));

    Collection<List<Item>> result = list.stream()
            .collect(Collectors.groupingBy(x -> Arrays.<Object>asList(x.keyA, x.keyB)))
            .values();

    for (List<Item> items : result) {
        System.out.println(items);
    }
}

static class Item {
    Integer keyA;
    Boolean keyB;
    Integer value;

    public Item(Integer keyA, Boolean keyB, Integer value) {
        this.keyA = keyA;
        this.keyB = keyB;
        this.value = value;
    }

    @Override
    public String toString() {
        return "Item{" +
                "keyA=" + keyA +
                ", keyB=" + keyB +
                ", value=" + value +
                '}';
    }
}

关于java - 在 Java 中按多个属性对对象进行分组的一般方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36335223/

相关文章:

python - 如何拆分两个嵌套列表并将各部分组合起来以创建两个新的嵌套列表

java - 使用 glReadPixels() 找到正确的上下文来截取屏幕截图

sql - 有效地搜索匹配给定属性/属性集及其值的记录(完全匹配、小于、大于)

java - ai直线追逐玩家的算法?

python - Python中列表列表中的列表中的值的平均值

python - 如何计算列表列表中存在的重复项目?

java - Akka 。如何摆脱 Actor 内部的业务逻辑?

java - 替换 jdbc.support.nativejdbc 在 Spring 5 中删除

java - 如何克服 Scanner 中 armstrongnumber 计算中的错误匹配异常?

python - 高效的 Python 搜索算法,用于在移动时间间隔内查找匹配项