Duvidas com ArrayList

13 respostas
L

Pessoal como posso verificar e remover duplicatas de uma lista?
Obrigado.

13 Respostas

T

Copie os elementos dessa lista para uma coleção que não aceite duplicatas (como um LinkedHashSet), limpe o arraylist original, e então copie de volta os elementos do LinkedHashSet para seu ArrayList. É preciso que hashCode e equals estejam definidos corretamente na classe cujos elementos integram a lista.

pmlm

Ou podes usar logo de início um LinkedHashSet se nunca quiseres inserir duplicados.

L

Hum legal,mas eh que preciso emitir uma mensagem para o usuario qdo for encontrada uma duplicata.

celso.martins

uai so…

Set<String> tree = new TreeSet<String>();
		
		tree.add("celso");
		
		if (!tree.add("celso")) {
			System.out.println("Elemento já existe");;
		}
L

ta dando nullPointer pq minha lista servicos e um arrayList e naum tem como mudar pois esta em um framework criado aqui msm na empresa,
O que posso fazer para resolver isso?
Obrigado.

@Override
    public void save() {
        HashSet<ItemServicoVenda> listaServicos = (LinkedHashSet<ItemServicoVenda>) getWindowContext().getAttribute(getClass().getCanonicalName() + ".table");
        getRequest().getSession().setAttribute("listaServicos", listaServicos);
        super.save();
        super.create();
        HashSet<ItemServicoVenda> tree = new LinkedHashSet<ItemServicoVenda>();
        System.out.println("lista servicos....:" + listaServicos.size());
        for (ItemServicoVenda item : listaServicos) {
            try {
                tree.add(item);
                if (!tree.add(item)) {
                    getListException().add(new FormActionException("Este item já foi incluido na NotaFiscal."));
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        listaServicos = null;
        listaServicos.addAll(tree);
        getRequest().getSession().setAttribute("listaServicos", listaServicos);
        super.save();
        super.create();

    }
celso.martins

Em primeiro lugar, eu fiz dois add’s apenas para demonstrar… dentro do for, não precisa fazer…

Estou vendo o seu código…

EDIT: onde você está tomando o NPE?

EDIT2: nunca lance uma Exception

celso.martins

Acho que achei.

Faça as correções que sugeri no post anterior.

E… tchannananan…

listaServicos = null;  
listaServicos.addAll(tree);

?!?!?!?!?!
Você está “matando” seu objeto e tentando adicionar algo nele.

Acho que é isso aí…

T

Não é à toa que setar algo para null é um “Code Smell” (ou seja, coisa que cheira mal e que pode ser um bug).

http://c2.com/xp/CodeSmell.html

L

olha soh dei uma mexida mas nao deu certo ele deixa incluir dois itens identicos

@Override
    public void save() {
        List<ItemServicoVenda> listaServicos = (List<ItemServicoVenda>) getWindowContext().getAttribute(getClass().getCanonicalName() + ".table");
        getRequest().getSession().setAttribute("listaServicos", listaServicos);
        super.save();
        super.create();
        Set<ItemServicoVenda> tree = new TreeSet<ItemServicoVenda>();
        for (ItemServicoVenda item : listaServicos) {
            try {
                System.out.println("Entrou no for.>>>>>>>>>>>>>>>>>>>>>>");
                if (!tree.add(item)) {
                     System.out.println("Entrou no tree.add(item).>>>>>>>>>>>>>>>>");
                    getListException().add(new FormActionException("Este item já foi incluido na NotaFiscal."));
                   }
            } catch (Exception ex) {
                ex.printStackTrace();
                   getListException().add(new FormActionException("Este item já foi incluido na NotaFiscal."));
            }
        }

        Iterator itr = tree.iterator();
        listaServicos.clear();
        getWindowContext().setAttribute(getClass().getCanonicalName(), listaServicos);
        while (itr.hasNext()) {
            ItemServicoVenda item = (ItemServicoVenda) itr.next();
            listaServicos.add(item);
        }
        getRequest().getSession().setAttribute("listaServicos", listaServicos);
        getWindowContext().setAttribute(getClass().getCanonicalName(), listaServicos);
        System.out.println("Lista size>>>>>>>>>>>>" + listaServicos.size());
        System.out.println("Lista size table>>>>>>>>>>>>" + listaServicos.size());
      
    }
celso.martins

Cara, acredito que a questão agora é que você está trabalhando com objetos. Objetos podem ter estados (valores dos atributos) idênticos, sem necessariamente serem iguais.

Então, tecnicamente, você não está incluindo nada repetido.

Por enquanto, ainda não pensei em nada que não fosse POG.

Mas acho que o caminho é esse. Vou continuar pensando. E você pensa por aí. Se arrumar alguma forma, posta. :wink:

EDIT: Esses seus objetos (Item) não possuem identificação?

T

Se você está usando um TreeSet, então ItemServicoVenda tem um método “compare”. Como é que ele foi implementado?

celso.martins

Thingol, é disso que você está falando?

L

Se você está usando um TreeSet, então ItemServicoVenda tem um método “compare”. Como é que ele foi implementado?

salve thingol,realmente nao tinha pensado nisso,implementei o metodo compareTo comparando pelo id e pelo objeto e td funcionou perfeitamente.
Obrigado pela ajuda amigos t+.

Criado 14 de maio de 2009
Ultima resposta 14 de mai. de 2009
Respostas 13
Participantes 4