Percorrer For encadeados dinamicos

5 respostas
furacao123

Aew galera estou com uma duvida ao percorrer for encadeados mas que virao de forma dinamica estou tentando aplicar recursividade mas nada...tenho um objeto ProdutoAtributo p que possui uma lista de ProdutoAtributoValor pv ou seja
p = "TAMANHO"
pv1 = "P"
pv2 = "M"
pv3 = "G"

p2 = "COR"
pv1 = "VERDE"
pv2 = "VERMELHO"

combinando esses valores eu teria o Objeto SubProduto que vai recebendo objetos pv e concatenando as descricoes esse subproduto serve como um decorator apenas para visualizacao no sistema
TAMANHO P, COR VERDE
TAMANHO P, COR VERMELHO...

agora a parte em codigo fiz essa combinacao estatica com 5 Atributos diferentes...
private List<ProdutoAtributo> lista;
    private List<SubProdutoDecorator> listaSub;
    private ProdutoAtributoController c = new ProdutoAtributoController();
    private List<ProdAtributoValor> listaAux = new ArrayList<ProdAtributoValor>();
    private SubProdutoDecorator subProduto = new SubProdutoDecorator();
    private List<SubProdutoDecorator> listaSubProduto = new ArrayList<SubProdutoDecorator>();
    private Produto p = new Produto();

private void teste() {

        lista = c.getAll();

        p.setDescricao("PRODUTO TESTE");

        for (ProdAtributoValor v1 : lista.get(0).getProdAtributoValorList()) {

            listaAux = new ArrayList<ProdAtributoValor>();
            listaAux.add(v1);

            for (ProdAtributoValor v2 : lista.get(1).getProdAtributoValorList()) {

                armazenaProdutoAtributo(v2, 1, 3);

                for (ProdAtributoValor v3 : lista.get(2).getProdAtributoValorList()) {

                    armazenaProdutoAtributo(v3, 2, 2);

                    for (ProdAtributoValor v4 : lista.get(3).getProdAtributoValorList()) {

                        armazenaProdutoAtributo(v4, 3, 1);

                        for (ProdAtributoValor v5 : lista.get(4).getProdAtributoValorList()) {

                            populaSubProduto(v5);

                        }
                    }
                }
            }
        }

        for (SubProdutoDecorator s : listaSubProduto) {
            System.out.println(s.getDescricao());
        }

        System.out.println(contador);

    }
private void populaSubProduto(ProdAtributoValor vFim) {

        subProduto = new SubProdutoDecorator();
        subProduto.setProduto(p);
        for (ProdAtributoValor v : listaAux) {
            subProduto.add(v);
        }
        subProduto.add(vFim);
        listaSubProduto.add(subProduto);
        contador++;

    }
private void armazenaProdutoAtributo(ProdAtributoValor v, int indexRemove, int vezesRemove) {

        for (int i = 0; i < vezesRemove; i++) {
            try {
                listaAux.remove(indexRemove);
            } catch (Exception e) {
            }
        }

        listaAux.add(v);
    }
Retorno 72 combinações
PRODUTO TESTE, TAMANHO - P, COR - VERDE, TIPO - REGATA, ESTAMPA - FLORESTA, GOLA - V
PRODUTO TESTE, TAMANHO - P, COR - VERDE, TIPO - REGATA, ESTAMPA - FLORESTA, GOLA - NORMAL
PRODUTO TESTE, TAMANHO - P, COR - VERDE, TIPO - REGATA, ESTAMPA - LOBO, GOLA - V
PRODUTO TESTE, TAMANHO - P, COR - VERDE, TIPO - REGATA, ESTAMPA - LOBO, GOLA - NORMAL
PRODUTO TESTE, TAMANHO - P, COR - VERDE, TIPO - POLO, ESTAMPA - FLORESTA, GOLA - V...

assim funciona perfeito mas e se o usuario informar apenas 2 Atributos ou mais de 5 atributos ae o sistema nao comporta pois esta estatico, alguem pode me dar uma força para tornar esse codigo dinamico

Obrigado.

5 Respostas

E

Por é que tem de ser um for?

furacao123

Entao nao precisa ser em for o que precisa eh varrer todas as combinações e dar certo…eu fiz aqui com for para dar o exemplo do que eu preciso fazer :slight_smile:

furacao123

to quebrando a cabeça, tentando com recursividade mas nao ta saindo nada.

Tem alguma ideia, repito nao precisa ser com for, coloquei com for apenas para mostrar o problema de maneira estatica

E

Você não precisa fazer um for “dentro” do outro.
Em vez disso, faça o seguinte: crie um método (usando apenas um “for”) que receba uma lista e um atributo, e retorne outra lista que tem esses atributos adicionados.
Se precisar adicionar 5 atributos, por exemplo, chame esse método uma vez para cada atributo, e com a saída de um método sendo a entrada do próximo.

furacao123

seria isso ou a lista é de ProdAtributoValor ?

private List<ProdAtributoValor> recursivo(List<ProdutoAtributo> lista, ProdutoAtributo p)

teria como dar um exemplo ?

Criado 14 de outubro de 2010
Ultima resposta 14 de out. de 2010
Respostas 5
Participantes 2