Boa Noite!
Como posso proceder para eliminar valores repetidos em um arraylist ?
Por exemplo…tenho um jbutton “MOSTRAR” que ao clicar, vai criando outros jbuttons que contenham os endereços ips das máquinas conectadas em broadcast. Gostaria de ao clicar, que só aparecesse as que ainda não foram mostradas. Neste caso, por exemplo sempre que o cliente 192.168.1.1 estiver conectado e eu clicar em mostrar vai aparecer o jbutton com o endereço ip dele mais os outros novos, mas gostaria que aparecesse somente 1 vez, sem ips repetidos.
Alguém poderia me dar uma força ai ?
Obrigado.
Boa noite, se em algum momento vc adiciona os ips na lista usa Set set = new HashSet ao invés de ArrayList, o Set não repete valores…
seguindo a sugestao do alberto, mas se voce ja tiver usando lista, voce pode eliminar as repeticoes assim:
List novaLista = new ArrayList(new HashSet(listaAntiga));
Eu to achando que o meu problema é um pouco diferente…
Vou tentar mostrar um trecho do código para ver se fica mais claro.
Essa é parte da classe TrataSocket que dispara uma thread e fica ouvindo uma porta e caso algum cliente
se conecte…ela é responsável por receber as mensagens e os respectivos ips das máquinas como neste trecho abaixo:
private ArrayList<String> ips_clientes = new ArrayList<String>();
ips_clientes.add(pacoteRecebido.getAddress().getHostAddress());
ips = new TreeSet<String>(ips_clientes);
public Set<String> Captura(){
return ips;
}
Agora na Classe TelaPrincipal eu tenho um JPanel e alguns botoes que por exemplo quando eu clicar nesse botão
“Mostrar” ele vai criar novos JButtons de acordo com o número de conexões de clientes que eu tiver e cada JButton
terá como atributo setText o endereço ip daquela máquina. Bom, isso é o que deveria acontecer, mas cada vez que eu clico em
“Mostrar” ele repete todos que já tinham, duplicando-os.
[code]private void buMostrarActionPerformed(java.awt.event.ActionEvent evt) {
try {
Set<String> ips = ts.Captura();
for(String s:ips)
this.MostraMaquinas(s);
} catch (Exception ex) {
ex.printStackTrace();
}
} [/code]
[code]private void MostraMaquinas(String ip_cliente) {
JButton buAcao = new JButton();
buAcao.setText(ip_cliente);
buAcao.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
buAcao_action(evt);
}
});
lista.add(buAcao);
paCentro.add(buAcao);
paCentro.updateUI();
paCentro.repaint();
}[/code]
É isso que eu gostaria de saber como eu poderia fazer para que não houvesse essa repetição ?
Obrigado pela ajuda
Ba, acho que consegui…
No método do action para o JButton “Mostrar” acrescentei:
[code]private void buMostrarActionPerformed(java.awt.event.ActionEvent evt) {
try {
Set<String> ips = ts.Captura();
for(String s:ips){
paCentro.repaint();
pack();
this.MostraMaquinas(s);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
[/code]
Mas está acontecendo de quando eu clicar…ele remove o elemento, e redimensiona o JPanel fazendo com que este quase não apareça…tem como eu fazer com que isso não aconteça? Queria que ao clicar o Panel ficasse do jeito que estava antes ou que
que aumentasse de acordo com os botoes que ele vá inserindo…pois assim mesmo adicionando 2 ou 3 botoes ele fica todo encolhido dai só puxando com o mouse… Não sei se tem a ver mas eu estou usando Flow Layout…
Valeuu