Guava Tableを用いた多次元データ構造の実装

多次元データ管理の基本概念

標準的な二次元テーブルは行と列の交差点で値を管理しますが、現実のデータモデルでは三つ以上の次元(例:時間・地域・製品カテゴリ)が必要となるケースが頻繁に発生します。GuavaのTableクラスはネイティブで多次元をサポートしませんが、適切なネスト構造を用いることでこの制限を克服できます。

Tableのネストによる三次元構造

Tableインスタンスを別のTableのセル値として配置することで、擬似的な三次元データ構造を構築します。各レイヤーが新たな次元を表現し、データアクセス時に複数キーを連鎖的に適用します。

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import java.time.LocalDate;

public class MultiDimTableExample {
    public static void main(String[] args) {
        // 親Table: 年月 -> 地域 -> 製品指標
        Table<String, String, Table<String, Double>> timeRegionTable = HashBasedTable.create();
        
        // 子Tableインスタンス生成
        Table<String, Double> tokyoMetrics = HashBasedTable.create();
        tokyoMetrics.put("デスクトップPC", 12500.0);
        tokyoMetrics.put("モニター", 8400.0);
        
        timeRegionTable.put("2024-06", "関東", tokyoMetrics);
        
        // データ取得: 2024年6月の関東地域におけるデスクトップPC売上
        Double pcSales = timeRegionTable.get("2024-06", "関東")
                            .get("デスクトップPC");
        System.out.println("売上額: " + pcSales);  // 出力: 12500.0
    }
}

多次元データの反復処理手法

ネストされたTable構造の全要素にアクセスするには、キーセットを階層的に走査します。rowKeySet()とcolumnKeySet()を組み合わせて各次元を順次処理します。

Table<String, String, Table<String, Integer>> inventoryData = HashBasedTable.create();

// データ投入処理(省略)

for (String month : inventoryData.rowKeySet()) {
    for (String warehouse : inventoryData.columnKeySet()) {
        Table<String, Integer> productStock = inventoryData.get(month, warehouse);
        for (String product : productStock.rowKeySet()) {
            Integer quantity = productStock.get(product);
            System.out.printf("%s %s 倉庫: %s - 在庫数%d%n", 
                month, warehouse, product, quantity);
        }
    }
}

Map連携による高次元拡張

四つ以上の次元が必要な場合、TableとMapを組み合わせて拡張します。最上位にMapを配置し、その値としてTableを格納することで次元数を増加させます。

import java.util.HashMap;
import java.util.Map;

public class FourDimensionalData {
    public static void main(String[] args) {
        // 四次元構造: 年度 -> 四半期 -> 地域 -> 製品カテゴリ
        Map<Integer, Table<String, String, Table<String, Double>>> annualData = new HashMap<>();
        
        Table<String, String, Table<String, Double>> q1Table = HashBasedTable.create();
        Table<String, Double> kantoElectronics = HashBasedTable.create();
        kantoElectronics.put("テレビ", 3560.0);
        q1Table.put("Q1", "関東", kantoElectronics);
        
        annualData.put(2024, q1Table);
        
        // 2024年度Q1関東地域のテレビ売上取得
        Double tvSales = annualData.get(2024)
                           .get("Q1", "関東")
                           .get("テレビ");
    }
}

実装上の考慮事項

ネスト型構造ではデータ取得時にnullチェックが必須です。また、次元が増加するほどメモリ消費量が指数関数的に増大するため、大規模データには不向きです。多次元分析が必要なシステムでは、この手法がデータ集計処理の効率化に寄与します。

タグ: Guava Java データ構造 Table 多次元モデル

5月23日 09:18 投稿