Pessoal…
tenho dois arrayslist… e preciso comparar se os itens que neles são iguais…
alguma dica.
estou tentando fazer um for each dentro do outro…
vlw
Pessoal…
tenho dois arrayslist… e preciso comparar se os itens que neles são iguais…
alguma dica.
estou tentando fazer um for each dentro do outro…
vlw
Oi!
E com os for´s aninhados, não foi possível?
Ou simplesmente procuras uma solução mais elegante?
E por fim, que tipo de objeto está comparando?
Olá, Rafael.
Como assim “iguais”?
Se são o mesmo objeto -> use apenas “.equals()”
Se possuem os mesmo elementos dentro -> use “removeAll([outra lista])”. Se sobrar alguma coisa dentro da primeira é porque não eram iguais.
Se possuem os mesmo elementos dentro e na mesma ordem -> Bem… essa eu resolveria com “for” mesmo
Espero ter ajudado.
Assim:
arrayList.equals(otherArrayList);
Ele vai retornar verdadeiro se o objeto passado como parametro tambem for uma lista, de mesmo tamanho e se cada objeto da lista forem iguais (atraves do metodo equals de cada objeto) e estiverem dispostos na mesma ordem.
=D
referência: http://download.oracle.com/javase/6/docs/api/index.html
assim pessoal…
for(ItemNota item1: nota1.getItens()){
item1.getValorProduto();
for(ItemNota item2: nota2.getItens()){
itemNfe.getValorProduto();
if(item1.getValorProduto().equals(item2.getValorProduto())){
System.out.println("são iguais!");
}
}
}
tenho que comparar os valores dos itens de duas notas
para verificar se certo…igual…
se tiver implementado o metodo equals para os objetos que estiverem dentro do ArrayList nao precisa do for…
é só usar o equals do AbstractList que o ArrayList herda…
¬¬"
mas precisamos saber se as ordens das listas são iguais, ou se não sabes a ordem das mesmas ???
se forem exatamente na mesma ordem, não precisas de 2 fors, basta pegar o elemento da segunda lista com base no índice da 1ª.
Se forem diferentes, aí sim, terás que percorrer a segunda, até achar o item da primeira que está na iteração e comparar os valores.
Abs []
[quote=JM4X]se tiver implementado o metodo equals para os objetos que estiverem dentro do ArrayList nao precisa do for…
é só usar o equals do AbstractList que o ArrayList herda…
¬¬"
http://download.oracle.com/javase/6/docs/api/index.html[/quote]
Algo me diz que o equals não funciona para objetos como o dele, somente Wrappers.
No caso dele ele criou uma classe com determinados atributos e quer saber se os mesmo são iguais, o equals não vai rolar.
Só um detalhe, até funciona, mas ele teria que sobrescrever o método equals da classe criada por ele
[quote=nel][quote=JM4X]se tiver implementado o metodo equals para os objetos que estiverem dentro do ArrayList nao precisa do for…
é só usar o equals do AbstractList que o ArrayList herda…
¬¬"
http://download.oracle.com/javase/6/docs/api/index.html[/quote]
Algo me diz que o equals não funciona para objetos como o dele, somente Wrappers.
No caso dele ele criou uma classe com determinados atributos e quer saber se os mesmo são iguais, o equals não vai rolar.[/quote]
quando o for passa na primeira vez ele pega os primeiro valores corretos e depois compara certinho…
porem, na segunda vez ele se perde, pegando trocado…
esses for estão certos?
tipo…não tem erro de lógica ai?
vlw
[quote=rafaelpiton][quote=nel][quote=JM4X]se tiver implementado o metodo equals para os objetos que estiverem dentro do ArrayList nao precisa do for…
é só usar o equals do AbstractList que o ArrayList herda…
¬¬"
http://download.oracle.com/javase/6/docs/api/index.html[/quote]
Algo me diz que o equals não funciona para objetos como o dele, somente Wrappers.
No caso dele ele criou uma classe com determinados atributos e quer saber se os mesmo são iguais, o equals não vai rolar.[/quote]
quando o for passa na primeira vez ele pega os primeiro valores corretos e depois compara certinho…
porem, na segunda vez ele se perde, pegando trocado…
esses for estão certos?
tipo…não tem erro de lógica ai?
vlw[/quote]
É como o JM4X explicou, os objetos precisam estar ordenados da mesma forma, caso contrário, não será válido.
Vamos supor que o Objeto da posição 0 é o mesmo da posição 10 da outra lista, vai dar false, quando na verdade, poderia ser true.
Sendo assim, para usar o equals da interface List, você precisa de duas etapas:
1 - Organizar ambas as listas da mesma forma (Podes criar uma classe que implementa o Comparator, depois o método sort() para organizar)
2 - Sobrescrever o método equals do seu objeto “Itemnota”
Fora isso, creio que somente for aninhados. De qualquer forma, aconselho fortemente a organizar as listas antes de compara-las.
Abraços.
[quote=adriano_si]mas precisamos saber se as ordens das listas são iguais, ou se não sabes a ordem das mesmas ???
se forem exatamente na mesma ordem, não precisas de 2 fors, basta pegar o elemento da segunda lista com base no índice da 1ª.
Se forem diferentes, aí sim, terás que percorrer a segunda, até achar o item da primeira que está na iteração e comparar os valores.
Abs [][/quote]
a ordem é o que vem do DB…
não é ordenada…
[quote=nel][quote=rafaelpiton][quote=nel][quote=JM4X]se tiver implementado o metodo equals para os objetos que estiverem dentro do ArrayList nao precisa do for…
é só usar o equals do AbstractList que o ArrayList herda…
¬¬"
http://download.oracle.com/javase/6/docs/api/index.html[/quote]
Algo me diz que o equals não funciona para objetos como o dele, somente Wrappers.
No caso dele ele criou uma classe com determinados atributos e quer saber se os mesmo são iguais, o equals não vai rolar.[/quote]
quando o for passa na primeira vez ele pega os primeiro valores corretos e depois compara certinho…
porem, na segunda vez ele se perde, pegando trocado…
esses for estão certos?
tipo…não tem erro de lógica ai?
vlw[/quote]
É como o JM4X explicou, os objetos precisam estar ordenados da mesma forma, caso contrário, não será válido.
Vamos supor que o Objeto da posição 0 é o mesmo da posição 10 da outra lista, vai dar false, quando na verdade, poderia ser true.
Sendo assim, para usar o equals da interface List, você precisa de duas etapas:
1 - Organizar ambas as listas da mesma forma (Podes criar uma classe que implementa o Comparator, depois o método sort() para organizar)
2 - Sobrescrever o método equals do seu objeto “Itemnota”
Fora isso, creio que somente for aninhados. De qualquer forma, aconselho fortemente a organizar as listas antes de compara-las.
Abraços.[/quote]
blz vlw…vou ver isso
Pelo que entendi então removeAll() resolve teu problema com poucas linhas, independente da ordem dos elementos.
[code]if (nota1.getItens().size()!=nota2.getItens().size())
return false; // não precisa testar mais nada. Se não possuem mesmo tamanho, são diferentes.
List listaTmp = new ArrayList();
listaTmp.addAll(nota1.getItens());
listaTmp.removeAll(nota2.getItens());
boolean eIgual = (listaTmp.size()==0);[/code]
Não apliquei o removeAll() direto na nota1.getItens() ou na nota2.getItens() por poder ter efeito colateral no restante do teu código.
[quote=nel]
Algo me diz que o equals não funciona para objetos como o dele, somente Wrappers.
No caso dele ele criou uma classe com determinados atributos e quer saber se os mesmo são iguais, o equals não vai rolar.[/quote]
Fala nel, parece-me que também não funciona com Strings…
Abs []
[quote=jyoshiriro]Pelo que entendi então removeAll() resolve teu problema com poucas linhas, independente da ordem dos elementos.
[code]if (nota1.getItens().size()!=nota2.getItens().size())
return false; // não precisa testar mais nada. Se não possuem mesmo tamanho, são diferentes.
List listaTmp = new ArrayList();
listaTmp.addAll(nota1.getItens());
listaTmp.removeAll(nota2.getItens());
boolean eIgual = (listaTmp.size()==0);[/code]
Não apliquei o removeAll() direto na nota1.getItens() ou na nota2.getItens() por poder ter efeito colateral no restante do teu código.[/quote]
cara mas se eu quiser saber o item que deu problema? tipo nesse getItens
tenho valor, quantidade…
digamos que o valor ficou diferente do outro…
entendeU?
vlw pela força!!
Bom… eu fiz um teste… não sei se a idéia foi correta, mas só funcionou iterando sobre as 2 listas:
package testesjava;
public class Pessoa {
private int codigo;
private String nome;
public Pessoa(int codigo, String nome){
this.codigo = codigo;
this.nome = nome;
}
public int getCodigo() { return codigo; }
public String getNome() { return nome; }
public boolean equals(Object o) {
Pessoa pc = (Pessoa) o;
if(this.codigo == pc.getCodigo()){
return true;
}
return false;
}
}
Pessoa p1 = new Pessoa(1, "Adriano");
Pessoa p2 = new Pessoa(2, "Carlos");
Pessoa p3 = new Pessoa(3, "Alfredo");
List<Pessoa> l1 = new ArrayList<Pessoa>();
List<Pessoa> l2 = new ArrayList<Pessoa>();
l1.add(p1);
l1.add(p2);
l2.add(p3);
l2.add(p1);
for(Pessoa p : l1) // Aqui não funcionou, não sei se está certo a forma que usei, mas foi assim que entendi que era o uso
if(l2.equals(p))
System.out.println("O [" + p.getNome() + "] existe nas 2 listas");
for(Pessoa p : l1) // Aqui foi normal. Ou seja, como ele já estava fazendo.
for(Pessoa pes : l2)
if(p.equals(pes))
System.out.println("O [" + p.getNome() + "] existe nas 2 listas");
Simples.
Os itens que sobrarem em listaTmp após o removeAll() representam os item diferentes de uma lista para outra.
esquece :{ inglês enferrujado é osso…
Relendo com calma, entendi… Precisa primeiro ordenar a lista ´pra depois validar se são iguais…
[quote=jyoshiriro]Simples.
Os itens que sobrarem em listaTmp após o removeAll() representam os item diferentes de uma lista para outra.[/quote]
Acho que resolve o seu problema não ??? agora resta saber se podes remover os elementos da 2ª lista…
PS: Yoshi, não tens vergonha de colocar uma foto dormindo em sala de aula ?? heuehue