java - 使用 Java 聚合两个层次树的笛卡尔积

标签 java data-structures tree hierarchical-data cartesian-product

需要使用Java对两个层次树结构的笛卡尔积进行聚合,请建议一些好的方法或API来完成此操作。

树结构:

乡村树:

节点|Id|ParentId

世界|1|1
亚洲|2|1
欧洲|3|1
印度|4|2
中国|5|2
英国|6|3
匈牙利|7|3
塞浦路斯|8|3

利润树:

节点|Id|ParentId
利润|1|1
收入|2|1
费用|3|1

这两个产品的笛卡尔积会给我 24 种组合 (8 X 3)。我需要汇总每个组合的值。

例如,我想知道欧洲、亚洲和世界的总收入、欧洲的总利润等

最佳答案

如果没有详细的结构,很难回答。但我会猜测它们可能是什么,您可以推断出您的结构。

enum EconomicDataType {
    PROFIT, REVENUE, EXPENSE;
}

interface GeographicNode {
    int getEconomicData(EconomicDataType type);
}

class Region implements GeographicNode {
    private List<GeographicNode> geographiesInRegion;
    public int getEconomicData(EconomicDataType type) {
        return geographiesInRegion.stream()
            .mapToInt(geog -> geog.getEconomicData(type))
            .sum();
    }
}

class Country implements GeographicNode {
    private EnumMap<GeographicNode, Integer> economicData;
    public int getEconomicData(EconomicDataType type) {
        return economicData.get(type);
    }
}

我将经济数据建模为 map 而不是树,因为坦率地说,鉴于数据没有任何层次结构,将其设为层次结构对我来说没有任何意义。

我也没有处理过数据丢失的情况。在从 map 获取数据之前添加 containsKey 检查并不难。

检索欧洲总收入之类的数据是:

europe.getEconomicData(EconomicDataType.REVENUE);

简单:-)

关于java - 使用 Java 聚合两个层次树的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27893810/

相关文章:

mysql - 如何将经常访问的数据放入数据库中的 "quick access"区域

python - PyGtk - 在特定行的 TreeView 中设置复选框不可见

java - Controller 中的commandlinerunner接口(interface)方法需要添加什么spring注释

java - 如何检查 Hibernate 中的实体是否脏?

java - 通过 HTTP 保护 Spring Data RepositoryRestResource (CrudRepository),但不是在内部

c++ - C++ 数据结构对象的生命周期是多少?

java - 我的分身被改变了吗?

c - 强烈返回错误的值

algorithm - 使用标签重新排列树

python - 在 python 中使用列表的树表示