Sobre código: Estrutura de dados, Lista

Estou estudando lista e me deparei com um problema:

Eu tenho um dicionário que é basicamente uma lista mas com uma CHAVE e um VALOR.
Quero fazer o seguinte:
Criar um dicionario que receba um estado (MG) como CHAVE e outro dicionário como VALOR.

Dicionario dic = new Dicionario();
dic.put("MG", new Dicionario());

Agora faço um get para pegar o dicionario que criei acima e acessar esse new dicionario que criei como valor. O get retorna objeto, então eu transformo em Dicionario.

((Dicionario) dicionario.get("MG")).put("CIDADE A", new Lista());

O get me retorna o valor do primeiro dicionario criado, nele eu setei uma chave (Cidade A) e um valor que é uma lista.

Nessa lista vou adicionar bairros.

((Lista)((Dicionario) dicionario.get(“MG”)).get(“CIDADE A”)).add(“CENTRO”);

Eu vou adicionar vários estados, varias cidades nesses estados e vários bairros nessas cidades.
Não consigo achar uma forma para imprimir desse formato:

MG
–CIDADE A
----CENTRO
SP
–CIDADE B
----PALMEIRAS

A unica forma que consegui imprimir foi assim

System.out.println(“MG”); // Quero automatizar isso

((Dicionario) dicionario.get(“MG”)).print(); // Aqui printa todas cidades de MG

((Lista)(((Dicionario) dicionario.get(“MG”)).get(“CIDADE A”))).print(); // Aqui printa todos os bairros da cidade A de MG.

public class Teste{
public static void main(String[] args){
Dicionario dicionario = new Dicionario();

    dicionario.put("MG", new CDicionario());
    dicionario.put("SP", new CDicionario());
    dicionario.put("RJ", new CDicionario());


    ((Dicionario) dicionario.get("MG")).put("CIDADE A", new Lista());
    ((Dicionario) dicionario.get("MG")).put("CIDADE B", new Lista());
    ((Dicionario) dicionario.get("RJ")).put("CIDADE C", new Lista());

    ((Lista)((Dicionario) dicionario.get("MG")).get("CIDADE A")).add("BAIRRO 1");
    ((Lista)((Dicionario) dicionario.get("MG")).get("CIDADE A")).add("BAIRRO 2");

    ((Lista)((Dicionario) dicionario.get("SP")).get("CIDADE B")).add("BAIRRO 4");
    ((Lista)((Dicionario) dicionario.get("SP")).get("CIDADE B")).add("BAIRRO 5");

    ((Lista)((Dicionario) dicionario.get("RJ")).get("CIDADE C")).add("BAIRRO 7");
    ((Lista)((Dicionario) dicionario.get("RJ")).get("CIDADE C")).add("BAIRRO 8");

    dicionario.printEstado("MG");
    
    ((Dicionario) dicionario.get("MG")).print();
    ((Lista)(((Dicionario) dicionario.get("MG")).get("CIDADE A"))).print();

    dicionario.printEstado("SP");
    ((Dicionario) dicionario.get("SP")).print();
    ((Lista)(((Dicionario) dicionario.get("SP")).get("CIDADE B"))).print();

    dicionario.printEstado("RJ");
    ((Dicionario) dicionario.get("RJ")).print();
    ((Lista)(((Dicionario) dicionario.get("RJ")).get("CIDADE C"))).print();
}}

QUERO IMPRIMIR DESSA FORMA
for (int i = 0; i < 3; i++){
System.out.println(“ESTADOS”);
for (int x=0; x < 3; x++)
System.out.println(" CIDADES");
for(int z=0; z < 3; z++)
System.out.println(" BAIRROS");
}

Vc teria que usar o padrão iterator

import java.lang.Iterable;
import java.util.Iterator;

public class Lista implements Iterable<Object> {
  
  public Object[] dados = new Object[]{ "item 1", "item 2", "item 3", "item 4" };
  
  public Iterator<Object> iterator() {
    return new Iterator<Object>() {
      int i = 0;
      public boolean hasNext() {
        return i < dados.length;
      }
      public Object next() {
        Object item = dados[i];
        i += 1;
        return item;
      }
    };
  }
  public static void main(String[] args) {
    Lista lista = new Lista();
    for (Object item : lista) {
      System.out.println(item);
    }
    
    System.out.println("imprimir 3 itens");
    
    Iterator itr = lista.iterator();
    for (int i = 0; i < 3; i++) {
      System.out.println(itr.next());
    }
  }
}

Para o dicionário, teria que criar uma classe Entry que contém a chave e o item, e retornar no método next.

Iterator<Entry> itr = dicionario.iterator();
for (int i = 0; i < 3; i++) {
  Entry entry = itr.next();
  System.out.println(entry.getKey());
  System.out.println(entry.getItem());
}

Depois fica fácil imprimir daquele jeito:

for (Entry estadoEntry : dicionario) {
  System.out.println("Estado: " + estadoEntry.getKey());
  Dicionario cidades = (Dicionario) estadoEntry.getItem();
  for (Entry cidadeEntry : cidades) {
    System.out.println("Cidade: " + cidadeEntry.getKey());
    Lista bairros = (Lista) cidadeEntry.getItem();
    for (Object bairro: bairros) {
      System.out.println("Bairro: " + bairro);
    }
  }
}