当前位置:首页 > 技术 > 正文内容

使用 Guava Table 构建多维数据结构

访客 技术 2026年6月16日 1

Guava 库中的 Table 接口提供了一种直观的二维键值存储方式,适用于以行和列作为联合主键的场景。尽管它原生仅支持两个维度(行键和列键),但通过结合嵌套结构或与 Map 配合使用,我们可以将其扩展为支持三维甚至更高维度的数据模型。

利用嵌套 Table 实现三维结构

一个常见的做法是让 Table 的每个单元格存储另一个 Table 实例,从而形成层级索引。例如,在分析业务指标时,可以将"时间"、"地区"和"指标类型"作为三个独立维度进行组织。

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import org.junit.jupiter.api.Test;

import java.util.Map;

public class ThreeDimensionalDataTest {

    @Test
    public void buildThreeLevelStructure() {
        // 外层表:日期 → 地区 → (内层表:指标名 → 数值)
        Table<String, String, Table<String, Integer>> timeRegionMetrics = HashBasedTable.create();

        // 为北方区域填充销售与利润数据
        Table<String, Integer> northMetrics = HashBasedTable.create();
        northMetrics.put("Revenue", 9800);
        northMetrics.put("Cost", 6700);

        timeRegionMetrics.put("2024-11-01", "North", northMetrics);

        // 为南方区域填充数据
        Table<String, Integer> southMetrics = HashBasedTable.create();
        southMetrics.put("Revenue", 8500);
        southMetrics.put("Cost", 5400);

        timeRegionMetrics.put("2024-11-01", "South", southMetrics);

        // 查询示例:获取某日某地的收入
        Table<String, Integer> targetData = timeRegionMetrics.get("2024-11-01", "North");
        Integer revenue = targetData.get("Revenue");
        System.out.println("North Region Revenue: " + revenue); // 输出: 9800
    }
}

这种设计允许开发者通过链式调用访问深层数据,逻辑清晰且易于维护。

遍历多级数据集

当需要对整个多维结构执行批量操作或生成汇总报告时,可以通过迭代外层的行键与列键,并逐层深入来完成全量扫描。

@Test
public void traverseMultiLayerTable() {
    Table<String, String, Table<String, Integer>> dataCube = HashBasedTable.create();

    // 初始化两组区域数据
    Table<String, Integer> eastQ4 = HashBasedTable.create();
    eastQ4.put("Sales", 3200);
    eastQ4.put("Expenses", 1800);

    Table<String, Integer> westQ4 = HashBasedTable.create();
    westQ4.put("Sales", 2900);
    westQ4.put("Expenses", 1600);

    dataCube.put("2024-10-01", "East", eastQ4);
    dataCube.put("2024-10-01", "West", westQ4);

    // 深度遍历所有维度
    for (String date : dataCube.rowKeySet()) {
        System.out.println("Report Date: " + date);
        for (String region : dataCube.columnKeySet()) {
            System.out.println("  Region: " + region);
            Table<String, Integer> metrics = dataCube.get(date, region);
            for (Map.Entry<String, Integer> metric : metrics.cellSet()) {
                System.out.println("    " + metric.getKey() + " = " + metric.getValue());
            }
        }
    }
}

输出结果会按层级展示完整的数据树,适合用于调试或导出结构化报表。

引入 Map 扩展至四维及以上

若需表达更复杂的结构(如年、月、地区、指标四维),可将 Table 嵌入标准 java.util.Map 中,实现灵活的多层索引体系。

@Test
public void fourDimensionModel() {
    // 四维映射:年份 → (月份 → (地区 → 指标))
    java.util.Map<String, Table<String, String, Table<String, Integer>>> yearMonthData =
        new java.util.HashMap<>();

    // 构造具体数据点
    Table<String, Integer> novEastStats = HashBasedTable.create();
    novEastStats.put("Orders", 450);
    novEastStats.put("Returns", 32);

    Table<String, String, Table<String, Integer>> november = HashBasedTable.create();
    november.put("2024", "November", novEastStats);

    yearMonthData.put("2024", november);

    // 提取特定维度值
    Table<String, Integer> result = yearMonthData.get("2024").get("2024", "November");
    Integer orderCount = result.get("Orders");
    System.out.println("2024 November Orders in East: " + orderCount); // 输出: 450
}

该方法虽牺牲部分类型安全性,但极大增强了表达能力,特别适用于动态维度或稀疏数据场景。

总结

虽然 Guava 的 Table 本质上是二维容器,但借助嵌套组合策略,能够有效模拟高维数据空间。这种模式在处理时间序列、分片统计、多标签监控等复杂业务中表现出色,既保持了代码简洁性,又提升了数据访问效率。

标签: GuavaTable

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。