[Resolvido] - Comparação em 2 arraylist gerandou um terceiro

6 respostas
LucianoTulio

Acredito minha logica não estaja errada, tenho 2 arraylist, de tipos diferentes mais com uma variavel em comum neles, a variavel codigocliente.
preciso fazer um comparação nesses codigocliente , se existir o msm valor nas duas adicionar em uma nova arraylist o valor da da variavel comum codigocliente, ele ate esta fazendo isso
mas ele nao percorre toda a lista ele cria so o começo dela.
segue o codigo

public void compararClientes(List<Clifiscojuridico>l1,List<Desativar>l2){
	List<Clifiscojuridico> lista = l1;
	List<Desativar>lista2 = l2; 
	List <Integer> codigos = new ArrayList<Integer>();
	
      for (Clifiscojuridico c : lista){ // cada obj da lista capturo o codigo do cliente
		Integer i = c.getCodcliente();
		for(Desativar d : lista2){ //para cada obj da lista eu percorro a lista2 comparando 
			Integer j = d.getCodcliente();
			if(i==j){ // aqui verifico a igualdade entre eles, se igual adiciono o numero do codigocliente na arraylist do tipo integer  
				codigos.add(i);
			}
		}
	}

Minha primeira lista tem 5 mil registro e a segunda 2,5mil preciso preencher a terceira e ta preenchendo apenas 39 deles, e fiz teste direto no banco e sao 2,3mil registro pra essa 3 lista,

alguma ideia do que seja??? Obrigado

6 Respostas

ErickRAR

Você pega esses valores do banco? Se sim, faça uma consulta com inner join.

ViniGodoy

Por favor, não peça urgência no fórum.

Alguns comentários:
//l1 e l2 são péssimos nomes
//E você não está retornando resultado.
public void compararClientes(List&lt;Clifiscojuridico&gt;l1,List&lt;Desativar&gt;l2){
    List&lt;Clifiscojuridico&gt; lista = l1; //Linha inútil
    List&lt;Desativar&gt;lista2 = l2;  //Linha inútil
    List &lt;Integer&gt; codigos = new ArrayList&lt;Integer&gt;();
	
    for (Clifiscojuridico c : lista){
        Integer i = c.getCodcliente();
        for(Desativar d : lista2){ //Extremamente ineficiente
            Integer j = d.getCodcliente();
            if(i==j){ 
                codigos.add(i);
            }
        }
    }
A forma correta:
public Set&lt;Integer&gt; compararClientes(List&lt;Clifiscojuridico&gt; clientes, List&lt;Desativar&gt; desativados){
    //Passo 1. Copiar os índices para um set
    Set&lt;Integer&gt; codigos = new HashSet&lt;Integer&gt;();
    for (Clifiscojuridico c : clientes) {
        codigos.add(c.getCodCliente());
    }

    //2. Testar as duplicatas
    Set&lt;Integer&gt; resultados = new TreeSet&lt;Integer&gt;();
    for (Desativar d : desativados) {
        if (codigos.contains(d.getCodcliente()) {
            resultado.add(d.getCodcliente());
        }
    }
    return resultados;
}
LucianoTulio

Malz aee ViniGodoy coloquei urgente que 3 perg q fiz ao forum nenhuma foi respondida
sei que estou utilizando nomes simples e não sugestivos, mas como estou apenas
realizando a logica para depois melhorar o codigo postei com esses nomes.

mas preciso fazer retornar uma list, nao entendi muito a classe Set
e vi que nao posso fazer um cast nele.

LucianoTulio

se eu for realizar um sql desse tipo
alguem poderia me ajudar com criteria

é bem simples

select desativar.codcliente from clifiscojuridico 
inner join desativar on desativar.codcliente=clifiscojuridico.codcliente
where tipoempresa <> 'SIMPLES'
and desativar.coddes in (0,1) 
order by codcliente;

ele realiza o select na tabelaclifiscojuridico que sao diferentes de simple e faz o inner join na tabela desativar para pegar somente
dos tipos coddes igual a 0 ou 1

ViniGodoy

Se você quer retornar um list, troque o tipo de retorno para List e troque a linha 9 por:

List&lt;Integer&gt; resultados = new ArrayList&lt;Integer&gt;();

A diferença será apenas que o set não retornará itens duplicados e também retornaria os ids ordenados.

LucianoTulio

ViniGodoy muito obrigado, eu não sabia sobre o Set mas pesquisei e encontrei uma vídeo aula explicando
tudo sobre ela, a diferença entre List e Set, e o TreeSet organiza em ordem
crescente, tbm me ajudou bastante.

Criado 25 de julho de 2012
Ultima resposta 26 de jul. de 2012
Respostas 6
Participantes 3