다차원 데이터 구조
일반적으로 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를 이용한 더 많은 차원 지원
더 많은 차원을 처리해야 하는 경우, Table과 Map을 결합하여 더 복잡한 중첩 구조를 만들 수 있습니다.
예제:
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
}
}