Melhor Pratica de Comparar Lista

9 respostas
A

Galera, seguinte qual a melhor maneira de percorrer essa lista e saber quais os nomes que se repetem ??

ArrayList Nomes = new ArrayList();

Nomes.add(Anderson);

Nomes.add(rodrigo);

Nomes.add(karina);

Nomes.add(giovanni);

Nomes.add(Anderson);

Nomes.add(rodrigo);

grato;
Anderson

9 Respostas

V

Isso é algum exercício da faculdade?

Percorra a lista com um for e conte os nomes usando um Map.

List<String> nomes = new ArrayList<String>(Collator.getInstance()); 
nomes.add("Anderson"); 
nomes.add("rodrigo"); 
nomes.add("karina"); 
nomes.add("giovanni"); 
nomes.add("Anderson"); 
nomes.add("rodrigo"); 

Map<String, Integer> map = new TreeMap<String, Integer>();

for (String nome : nomes) {
    Integer count = map.get(nome);
    if (count == null)
       count = 0;
    map.put(nome, count+1);
}

//Agora, para exibir todos os nomes repetidos e quantas vezes se repetiram:

for (String nome : map.keySet()) {
   System.out.printf("O nome %s se repetiu %s vezes.", nome, map.get(nome));
   System.out.println();
}
N

Para responder essa pergunta, é necessário saber o que você quer exatamente.

:arrow: Você quer adicionar elementos em uma coleção e garantir que não haja objetos duplicados? Use java.util.HashSet.

:arrow: Você quer adicionar elementos em uma coleção e a cada vez que fizer isso verificar se já existe o elemento nela? Use java.util.HashMap.

Basicamente, HashSet (que implementa a interface java.util.Set), não permite elementos duplicados e HashMap (que implementa a interface java.util.Map), mapeia chaves para valores. Ou seja, cada objeto que você incluir em um HashMap terá uma chave, e você os acessa através dela.

Para mais informações dê uma pesquisada sobre Java Collections Framework.

R

Uma outra solução para saber quais os elementos que se repetem, mas sem se imprtar com a quantidade de vezes que se repete.

List<String> nomes = new ArrayList<String>();
    nomes.add("Anderson");
    nomes.add("rodrigo");
    nomes.add("karina");
    nomes.add("giovanni");
    nomes.add("Anderson");
    nomes.add("rodrigo"); 
		
    List<String> temp = new ArrayList<String>(nomes);
	 for(String nome: nomes){
		 temp.remove(nome);
		  if(temp.contains(nome))
			 System.out.println("Nome repetido "+nome);
			 
	 }

[]´s
Rodrigo

_

voce precisa saber quais sao os repetidos, ou simplesmente nao deixar adicionar repetidos?

neste caso, como a lista é pequena, você pode percorrer a lista toda comparando mesmo…
em listas grandes, o ideal é usar um algoritmo de busca, binarysearch por exemplo…

se você não quiser uma coleção com elementos repetidos, use alguma collection que implemente a classe Set, como HashSet por exemplo…

A

Eu preciso pegar somente os repetidos

G
List<String> nomes = new ArrayList<String>();
	     nomes.add("Anderson");
	     nomes.add("rodrigo");
	     nomes.add("karina");
	     nomes.add("giovanni");
	     nomes.add("Anderson");
	     nomes.add("rodrigo");
	     
	     List<String> outra = new ArrayList<String>(nomes);
	     for(String s : outra){
	    	 if(nomes.indexOf(s) == nomes.lastIndexOf(s)){
	    		 nomes.remove(s);
	    	 }
	     }

Entendeu, seu o primeiro índice for igual ao último quer dizer que ele não é repetido e deve ser retirado da lista, mas a lista terá terá entradas repetidas daí você poe fazer o seguinte:

Set<String> nomesFinal = new HashSet<String>(nomes);
A

muito obrigado,

mas e fosse no cenário abaixo, que tenho objetos dentro da minha lista
e quisesse pegar os endereços iguais ??? como ficaria ??

ArrayList nomes = new ArrayList();

Nome nome = new Nome();
     Endereco endereco = new Endereco();
     
     nome.setNome("Anderson");
     endereco.setEndereco("Rua A");
     nome.setEndereco(endereco);
    
     nomes.add(nome);
     
     Nome nomea = new Nome();
     Endereco enderecoa = new Endereco();
     
     nomea.setNome("Karina");
     enderecoa.setEndereco("Rua B");
     nomea.setEndereco(enderecoa);
     
     nomes.add(nomea);
     
     Nome nomec = new Nome();
     Endereco enderecob = new Endereco();
     
     nomec.setNome("Giovanni");
     enderecob.setEndereco("Rua A");
     nomec.setEndereco(enderecob);

obrigado…

R

Olá,

Desde que vc implemente o equals() nas classes que vai colocar em sua lista, a solução que postei tbm serve.

[]´s
Rodrigo

G

Primeiro você tem uma lista de pessoas

daí você criar um set de endereços e outra lista para guardas as pessoas repetidas.

Se você conseguir adicionar um endereço lá, é porque não tinha, mas se o método add retornar false quer dizer que já existia um endereço igual à este no set e você deve adicionar essa pessoa à uma outra lista!

class Pessoa{
  private String nome;
  private String endereco;

  //getters e setters
}

// na outra classe

List<Pessoa> pessoas = new ArrayList<Pessoa>();
Set<String> enderecos = new HashSet<String>();
List<Pessoa> pessoasRepetidas = new ArrayList<Pessoa>();

for(Pessoa p : pessoas){
  if(!enderecos.add(p.getEndereco)){
    pessoasRepetidas.add(p);
  }
}

ou na sua classe Pessoa, você poderia até reescrever o método equals, mas você pode ter problemas em outros lugares

Criado 11 de janeiro de 2007
Ultima resposta 11 de jan. de 2007
Respostas 9
Participantes 6