Olá pessoal,
Se eu tiver 2 arraylist:
dados1 e dados2, e quiser testar se há igualdade no conteúdo dos 2. Como eu faço?
Valeu!
Olá pessoal,
Se eu tiver 2 arraylist:
dados1 e dados2, e quiser testar se há igualdade no conteúdo dos 2. Como eu faço?
Valeu!
Use o equals() da interface List.
Porém ele só retornará true se os elementos forem iguais e estiverem na mesma ordem.
Até aí eu sei! Eu gostaria é de verificar os dados dentro da arraylist, e ver se há diferença, e se houver, quais são!
Bem, creio que aí só mesmo com um iterator e verificando cada elemento da lista.
Cristiano,
Eu sugiro que você faça o seguinte:
[list] reimplemente o método toString() para fazer um dump dos atributos da sua classe;[/list]
[list] reimplemente o método equals() para também comparar os atributos (o Eclipse 3.2 faz isso para você se você for clicar com o botão direito e escolher em Source > Generate hashCode() and equals()…)[/list]
Dá uma olhada no exemplo que eu fiz:
package com.br.testing;
import java.util.Random;
public class Player {
private int rank;
private String name;
public Player(int rank) {
this.rank = rank;
}
public static void main(String[] args) {
Player[] players1 = createPlayers(10);
Player[] players2 = createPlayers(10);
for (int i = 0; i < players1.length; i++) {
Player p1 = players1[i];
Player p2 = players2[i];
if (!p1.equals(p2)) {
System.out.println("Player " + p1 + " mudou para " + p2);
}
}
}
public static Player[] createPlayers(int size) {
String[] names = { "João", "Pedro", "Oligário", "Jefferson", "Felipe", "Pablo" };
Player[] players = new Player[size];
Random r = new Random();
for (int i = 0; i < size; i++) {
players[i] = new Player(r.nextInt(100));
players[i].name = names[r.nextInt(names.length)];
}
return players;
}
@Override
public String toString() {
return "[name: " + name + " | rank: " + rank + "]";
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Player other = (Player) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (rank != other.rank)
return false;
return true;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Filipe, tem certeza que é isso o melhor maneira de comprar os conteudos dos lists?
Bom, acho que você teria que usar o equals() e o removeAll().
Não sei o quão detalhista você quer ser mas veja bem:
Se você precisar mesmo é dos elementos idênticos, pode ainda fazer:
lista1.retainAll(lista2);
O retainAll apaga todos os elementos da lista1 que não estiverem na lista2. Ou seja, a lista resultante será a intersecção das duas listas.
Agora, se você precisar validar também a ordem e descobrir quais elementos não correspondem a ordem correta. Aí terá que implementar o algoritmo na mão mesmo.
Quanto ao que o Felipe falou. Realmente é uma boa prática reimplementar o equals e toString. Mas não sei se no seu caso será necessário.
Para mais informações leia o capítulo 3, e no capítulo 7, item 32 do livro Effective Java. Esses dois capítulos podem ser lidos no site oficial do livro:
http://java.sun.com/docs/books/effective/chapters.html
Aliás, eu tenho esse livro e é muito bom. Se puder, leia todos os capítulos de exemplo ou compre o livro. Só para você ter uma idéia os métodos hashCode e equals que o Eclipse gera são baseados nos algoritmos propostos nesse livro!
Vini, copiei e colei um post que criei antes.
Ve se fica mais claro…
Eu tenho uma 1 metodo do meu dao que me retorna uma lista de Pessoas.
Pessoas.
private Integer id;
private String nome;
E outro metodo que me retorna uma list de vendas.
Venda.
private Integer id;
private Integer cliente; ( Aqui salva o id da pessoa )
private String produto;
Preciso exiber o produto e o nome do cliente que compro o tal produto.
Eu fiz de 2 maneiras, mas depois de ler o seu post, pensei esse cara sabe de alguma api que resolva isso para mim.
Segue o codigo que eu fiz:
for (Venda venda: vendas) {
for (Pessoa pessoa : pessoas) {
if (pessoa.getCodPessoa().equals(venda.getCliente())) {
venda.setCliente(pessoa.getNome());
vendasNormalizado.add(venda);
}
}
}
E crio uma lista( vendasNormalizado ) com o id da venda, o nome do produto, e o nome do cliente vindo da lista pessoa quando os codigos do cliente de venda for igual ao id de pessoa…
Ficou mais claro?
Deixa eu ver se eu entendi.
Você tem uma lista com algumas vendas e uma lista com algumas pessoas.
E precisa saber quais foram as vendas que foram feitas para as pessoas da lista de pessoas.
Se for isso, acho que seu código está certo. Que eu me lembre, não tem uma maneira direta de fazer isso pela API.
Só uma coisa… não seria melhor a classe venda ter um referência a classe pessoa, ao invés de guardar somente o ID? Evitaria a duplicidade da informação com o setNome, além de possibilitar o equals diretamente.
Ou você está pensando em apagar o cliente no futuro e manter um histórico do nome na venda?
Vini, nao estou pensando em apagar nenhum nem outro.
Mesmo que eu apague algum cliente, nao irei apagar as vendas dele.
Mas duvido que eu apague alguem do banco por qualquer motivo. =)
Eu ja tentei fazer referencia usando o hibernate, fk. Porem os bancos sao diferentes.
Tem outra ideia, ou se a minha estiver equivocada =/
Complementando o meu post anterior.
Em casos de 200 vendas. Sendo que muito caso a venda é para o mesmo cliente.
Exemplo o Vini compro 50 livros diferentes e gero ID diferentes porem o cliente é o Vini e o ID do Vini é 15, preciso rodar o laca 200x se eu já sei que todos os ID de pessoa tem o nome Vini?
Seria bom dizer que todos os 15, deve ser o nome Vini.
Compliquei?!