Estruturas Multidimensionais com Guava Table

Representando Dados Multidimensionais com Guava

Por padrão, uma Table do Guava funciona como uma estrutura bidimensional, semelhante a uma tabela de dados com linhas e colunas. Entretanto, em cenários onde se necessita de indexação em múltiplos níveis — como agrupamentos hierárquicos ou índices compostos — torna-se essencial representar dados de forma multidimensional.

A biblioteca Guava não oferece uma implementação nativa para estruturas tridimensionais ou de ordem superior. Contudo, é possível simular essas estruturas combinando Table com outras coleções como Map ou List, criando assim representações eifcazes para dados complexos.

1. Construindo Dimensões com Tabelas Aninhadas

Uma abordagem direta consiste em aninhar uma Table dentro de outra. Dessa forma, cada célula da tabela externa pode conter uma sub-tabela, expandindo a dimensionalidade do modelo de dados.

Considere um exemplo que armazena séries temporais com três dimensões: data, região e métrica de negócio.

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import java.util.HashMap;
import java.util.Map;

public class ExemploTabelaMulti {

    public static void main(String[] args) {
        // Estrutura principal: data -> região -> (métrica -> valor)
        Table<String, String, Map<String, Double>> dadosTemporais = HashBasedTable.create();

        // Dados para a região Norte na data especificada
        Map<String, Double> metricasNorte = new HashMap<>();
        metricasNorte.put("vendas", 15000.0);
        metricasNorte.put("lucro", 3200.50);
        dadosTemporais.put("2024-12-01", "Norte", metricasNorte);

        // Dados para a região Sul na mesma data
        Map<String, Double> metricasSul = new HashMap<>();
        metricasSul.put("vendas", 18700.0);
        metricasSul.put("lucro", 4150.75);
        dadosTemporais.put("2024-12-01", "Sul", metricasSul);

        // Consulta específica: vendas do Norte em 01/12/2024
        Double vendasNorte = dadosTemporais.get("2024-12-01", "Norte").get("vendas");
        System.out.println("Vendas Norte (2024-12-01): R$" + vendasNorte);

        // Consulta: lucro do Sul na mesma data
        Double lucroSul = dadosTemporais.get("2024-12-01", "Sul").get("lucro");
        System.out.println("Lucro Sul (2024-12-01): R$" + lucroSul);
    }
}

2. Percorrendo Estruturas Multidimensionais

A navegação em dados aninhados é realizada por meio de iterações encadeadas. Utilize os métodos rowKeySet() e columnKeySet() para percorrer os índices externos e, em seguida, acessar os dados internos.

import com.google.common.collect.Table;
import java.util.Map;

public class PercorrendoMultiDados {

    public static void listarTodosDados(Table<String, String, Map<String, Double>> tabela) {
        for (String data : tabela.rowKeySet()) {
            System.out.println("Data: " + data);
            for (String regiao : tabela.columnKeySet()) {
                Map<String, Double> metricas = tabela.get(data, regiao);
                if (metricas != null) {
                    System.out.println("  Região: " + regiao);
                    for (Map.Entry<String, Double> entrada : metricas.entrySet()) {
                        System.out.println("    " + entrada.getKey() + ": " + entrada.getValue());
                    }
                }
            }
        }
    }
}

3. Expandindo para Mais Dimensões com Map

Para adicionar uma quarta ou quinta dimensão, pode-se combinar Map com Table. Cada nível do Map atua como um índice adicional, permitindo uma modelagem flexível e escalável.

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import java.util.HashMap;
import java.util.Map;

public class QuartaDimensao {

    public static void main(String[] args) {
        // Estrutura: ano -> (trimestre -> (região -> métricas))
        Map<String, Table<String, String, Map<String, Double>>> dadosAnuais = new HashMap<>();

        // Preparando dados para o ano de 2024
        Table<String, String, Map<String, Double>> dados2024 = HashBasedTable.create();

        Map<String, Double> metricasT1Norte = new HashMap<>();
        metricasT1Norte.put("receita", 45000.0);
        dados2024.put("Q1", "Norte", metricasT1Norte);

        dadosAnuais.put("2024", dados2024);

        // Consultando a quarta dimensão
        Double receitaT1Norte = dadosAnuais.get("2024").get("Q1", "Norte").get("receita");
        System.out.println("Receita Q1 2024 - Norte: R$" + receitaT1Norte);
    }
}

A estratégia de aninhamanto de coleções do Guava permite construir representações multidimensionais robustas. Embora a Table nativa seja limitada a dois eixos, a combinação com outras estruturas torna viável a modelagem de dados complexos encontrados em áreas como análise de séries temporais, modelagem de dados hierárquicos e ssitemas de recomendação.

Tags: Guava Java Collections Multidimensional Data Table API Data Modeling

Publicado em 7-24 21:06