public void registaCompra(Compra compra) {
    Mes mes = compra.getMes();
    Produto produto = compra.getProduto();
    FichaClienteCompras ficha_cliente;

    try {
      ficha_cliente = getFichaClienteNoClone(compra.getCliente());
    } catch (ClienteNaoExisteException ex) {
      ficha_cliente = new FichaClienteCompras();
      this.arvoreClientes.put(compra.getCliente().clone(), ficha_cliente);
    }

    if (ficha_cliente.getNumComprasMes(mes, TipoCompra.AMBOS) == 0) {
      numeroClientesDistintosPorMes[mes.getIndiceArray()]++;
    }

    if (ficha_cliente.getTotalCompras() == 0) {
      numeroTotalClientesDistintos++;
    }

    ParProdutoNClientes par_prod_nclis;

    try {
      par_prod_nclis = this.getParProdutoNClientesNoClone(produto);
    } catch (ProdutoNaoExisteException ex) {
      par_prod_nclis = new ParProdutoNClientes();
      this.arvoreParesProdutoNClientes.put(compra.getProduto().clone(), par_prod_nclis);
    }

    try {
      Matriz_Int_12x2 comprasMeses = ficha_cliente.getNumComprasProdutoMeses(produto);

      if (comprasMeses.getValorMesTipoCompra(mes, TipoCompra.AMBOS) == 0) {
        par_prod_nclis.addNumeroClientesMes(mes, 1);
      }

      if (comprasMeses.getSomaTotal() == 0) {
        par_prod_nclis.addNumeroTotalClientesDistintos(1);
      }

    } catch (ClienteNaoComprouProdutoException ex) {
      par_prod_nclis.addNumeroClientesMes(mes, 1);
      par_prod_nclis.addNumeroTotalClientesDistintos(1);
    }

    if (compra.getPreco() == 0) {
      this.numeroComprasValorZero++;
    }

    ficha_cliente.regista_compra(compra);
  }
  public Map<Mes, Integer> getNumeroClientesDistintosMeses() {
    Mes mes;
    HashMap<Mes, Integer> resultado = new HashMap<>();

    for (int i = 0; i < 12; i++) {
      mes = Mes.numero_to_mes(i + 1);
      resultado.put(mes, this.numeroClientesDistintosPorMes[i]);
    }

    return resultado;
  }
 public int getNumeroClientesDistintosMes(Mes mes) {
   return this.numeroClientesDistintosPorMes[mes.getIndiceArray()];
 }