Guava Table를 활용한 다차원 데이터 관리

다차원 데이터 구조

일반적으로 Table행과 열의 교차점에 데이터가 저장되는 2차원 테이블로 간주됩니다. 그러나 더 많은 차원으로 그룹화 및 인덱싱을 원한다면, Guava Table을 다른 자료구조와 결합하여 다차원 데이터를 표현할 수 있습니다.

Guava Table은 직접적으로 3차원 이상의 구조를 지원하지 않지만, Map, List 등의 컬렉션과 함께 사용하여 다차원 데이터 구조를 모방할 수 있습니다.

1. 중첩된 Table을 이용한 다차원 데이터 구현

가장 직관적인 방법은 각 셀을 하위 Table로 취급하는 것입니다. 예를 들어, 날짜, 지역, 지표를 세 가지 차원으로 사용하여 시간 시퀀스 데이터를 표현할 수 있습니다.

예제:

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;

public class MultiDimensionalDataExample {
    public static void main(String[] args) {
        // 3차원 Table: 날짜 -> 지역 -> 지표
        Table<String, String, Table<String, Integer>> multiDimTable = HashBasedTable.create();

        // 지역-지표 Table 생성
        Table<String, Integer> regionData = HashBasedTable.create();
        regionData.put("Sales", 1000);
        regionData.put("Profit", 200);

        // 날짜와 지역에 맞춰 데이터 추가
        multiDimTable.put("2024-12-01", "북부", regionData);

        // 다른 지역 데이터 추가
        Table<String, Integer> regionData2 = HashBasedTable.create();
        regionData2.put("Sales", 1200);
        regionData2.put("Profit", 300);
        multiDimTable.put("2024-12-01", "남부", regionData2);

        // 특정 값 조회: 2024년 12월 1일 북부 지역의 Sales
        Table<String, Integer> northRegionData = multiDimTable.get("2024-12-01", "북부");
        int northSales = northRegionData.get("Sales");
        System.out.println("2024년 12월 1일 북부 지역 Sales: " + northSales); // 출력: 1000

        // 다른 차원의 데이터 조회
        Table<String, Integer> southRegionData = multiDimTable.get("2024-12-01", "남부");
        int southProfit = southRegionData.get("Profit");
        System.out.println("2024년 12월 1일 남부 지역 Profit: " + southProfit); // 출력: 300
    }
}
2. 다차원 데이터의 조회와 순회

다차원 데이터 구조에서 데이터를 조회하거나 순회하려면 중첩된 Table 구조를 사용하여 깊이 우선 탐색을 수행하거나, 여러 차원의 인덱스를 통해 빠르게 데이터에 접근할 수 있습니다.

예제:

public class MultiDimensionalTraversalExample {
    public static void main(String[] args) {
        Table<String, String, Table<String, Integer>> multiDimTable = HashBasedTable.create();

        // 데이터 생성 및 추가
        Table<String, Integer> regionData1 = HashBasedTable.create();
        regionData1.put("Sales", 2000);
        regionData1.put("Profit", 500);
        Table<String, Integer> regionData2 = HashBasedTable.create();
        regionData2.put("Sales", 1500);
        regionData2.put("Profit", 450);
        multiDimTable.put("2024-12-01", "북부", regionData1);
        multiDimTable.put("2024-12-01", "남부", regionData2);

        // 다차원 데이터 순회
        for (String date : multiDimTable.rowKeySet()) {
            System.out.println("날짜: " + date);
            for (String region : multiDimTable.columnKeySet()) {
                Table<String, Integer> regionData = multiDimTable.get(date, region);
                System.out.println("지역: " + region);
                for (Map.Entry<String, Integer> entry : regionData.entrySet()) {
                    System.out.println(entry.getKey() + ": " + entry.getValue());
                }
            }
        }
    }
}
3. Map를 이용한 더 많은 차원 지원

더 많은 차원을 처리해야 하는 경우, TableMap을 결합하여 더 복잡한 중첩 구조를 만들 수 있습니다.

예제:

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

public class NestedTableForHigherDimensions {
    public static void main(String[] args) {
        // 4차원 데이터 구조: 년도 -> 월 -> 지역 -> 판매/수익 등
        Map<String, Table<String, String, Table<String, Integer>>> nestedTable = new HashMap<>();

        // 3차원 Table: 지역 -> 판매/수익 등
        Table<String, String, Integer> regionData = HashBasedTable.create();
        regionData.put("Sales", 1500);
        regionData.put("Profit", 300);

        // 4차원 Table에 데이터 저장
        Table<String, String, Table<String, Integer>> yearTable = HashBasedTable.create();
        yearTable.put("2024", "1월", regionData);
        nestedTable.put("2024", yearTable);

        // 4차원 데이터 조회
        Table<String, String, Integer> januaryData = nestedTable.get("2024").get("1월");
        int januarySales = januaryData.get("Sales");
        System.out.println("2024년 1월 판매량: " + januarySales); // 출력: 1500
    }
}

태그: Guava Table java MultiDimensionalData

6월 15일 00:30에 게시됨