Alterar valor de um Set [Resolvido]

15 respostas
M

Bom dia,

Gostaria de saber se é possível alterar o valor que esta dentro de um set?

Sei que dentro do set está um objeto, seria possível eu resgatando o objeto e trocando o conteúdo dele?

No caso seria um set

Eu vi uma solução mais rápida que seria remover e adicionar o novo valor, ao que me parece um pouco sem logica não?
Tendo em vista que poderia ser feito de outras formas…como no arrayList…

Que vc pega o indice e usa o metodo set();

Obrigado

Valeu!

15 Respostas

CristianPalmaSola10

Voce naum foi muito claro, ficou dificil de compreender

posta o seu codigo ou explica melhor.

Set ? esta falando de uma classe, um objeto seu ou um objeto do tipo list, arraylist e tals

M

CristianPalmaSola10:
Voce naum foi muito claro, ficou dificil de compreender

posta o seu codigo ou explica melhor.

Set ? esta falando de uma classe, um objeto seu ou um objeto do tipo list, arraylist e tals

Ok, vamos por partes…

Estou criando uma classe telefone, que tem um atributo set<string> telefones…

Este atributo poderá ter objetos adicionados, alterados e removidos…funções básicas

E ai queria saber…

Pra alterar, um valor de um objeto do set<string> telefones, como posso fazer?

Vi em um fórum sugerindo remover e adicionar, é algo que eu já havia pensado mas ainda queria ver se algo mais inteligente a se fazer…

Obrigado

Rodrigo_Sasaki

o Set trabalha de maneira diferente do List, e ambos devem ser utilizados em situações diferentes.

o Set não permite dados repetidos, portanto sempre que tentar adicionar um objeto, igual a algum existente no Set (igual significa que o equals entre eles retorna true), não será adicionado.

Portanto para fazer o que quer você tem que remover, e adicionar, mas isso não faria sentido, pois você tem um Set de Strings, então vai remover para adicionar a mesma coisa?

Por que você não usa um ArrayList? parece melhor para o seu caso.

M

[quote=digaoneves]

Cara não irei provavelmente adicionar a mesma coisa, mas com usuaruio tudo é possivel, ainda to analisando a possibilidade, mas antes de adicionar um novo, sempre verifico se já existe, caso não exita emito uma exceção ao usuário…

Eu tava usando o arrayList mas como mencionei acima, verifiquei que o set fosse melhor, masssssssssss eu poderia usar o metodo contais e retornar um booleano se já existe tal objeto…

Enfim obrigado

nel

Primeiro, tu tens uma classe Telefone e nela tu tem vários telefones ?

Qual o sentido disso ?
E minha opinião, é que tu crie um identificador para o telefone, então. O telefone x tem o número y.
De forma “inteligente” pode usar um Map, onde a chave é o x e o valor o y. Dessa forma, tu pega apenas o identificador (chave) e faz o que bem entende. Se quiser alterar, é só adicionar novamente no Map que ele se encarrega de sobrescrever o antigo. Com Set, tu não tem outra alternativa além de remover e adicionar, em caso de alteração e se usar um ArrayList, como sugeriu o digaoneves, você vai ter N telefones e vai manter o “antigo”.

Veja a sua necessidade e depois decida como implementar.

M

[quote=nel]Primeiro, tu tens uma classe Telefone e nela tu tem vários telefones ?

Não entendi muito bem sua pergunta, mas para entender os próximos passos…

Irei fazer assim, relacionar uma classe telefone, com contato atraves um hashmap agenda…

Map<Contato, Telefone> agenda;


Qual o sentido disso ?
E minha opinião, é que tu crie um identificador para o telefone, então. O telefone x tem o número y.
De forma “inteligente” pode usar um Map, onde a chave é o x e o valor o y. Dessa forma, tu pega apenas o identificador (chave) e faz o que bem entende. Se quiser alterar, é só adicionar novamente no Map que ele se encarrega de sobrescrever o antigo. Com Set, tu não tem outra alternativa além de remover e adicionar, em caso de alteração e se usar um ArrayList, como sugeriu o digaoneves, você vai ter N telefones e vai manter o “antigo”.

Veja a sua necessidade e depois decida como implementar.

Eu ja usei HashMap, é bastante legal, tem a ideia de banco de dados…

Mas me explica uma coisa…

seria assim

X - Y
1 - 100
2 - 200
3 - 300

Isso que vc quer dizer?

Sobre alterar o valor do objeto que esta no value, seria assim?

Eu pegaria o valor do X atraves de uma pesquisa por valor no Y, e passaria para pro Y o novo valor?

Obrigado

nel
Map<Integer, String> telefones = new HashMap<Integer, String>();
telefones.put(10, "34233232");
telefones.put(11, "42424242");

//buscar
if (telefones.containsKey(10)) {
   String tel = telefones.get(10);
}

// alterar/criar
telefones.put(10, "434234343");

O alterar/criar é simples. Se a chave 10 já existir, ele substitui o valor, caso contrário, apenas adiciona um novo telefone.
Cuidado, não está fechando a tag quote e está confuso de ler sua dúvida.

M
nel:
Map<Integer, String> telefones = new HashMap<Integer, String>();
telefones.put(10, "34233232");
telefones.put(11, "42424242");

//buscar
if (telefones.contains(10)) {
   String tel = telefones.get(10);
}

// alterar/criar
telefones.put(10, "434234343");

O alterar/criar é simples. Se a chave 10 já existir, ele substitui o valor, caso contrário, apenas adiciona um novo telefone.

macario1983:
Bom desse seu jeito ta bacana einh....Quase igual ao que eu usava no List.. Mas uma pergunta, como que se trata no Map para não adicionar sobre valores repetidos no X? Do modo que eu havia lhe informado é uma boa? Verificando com o contains e retornando uma excessao?
nel:
Cuidado, não está fechando a tag quote e está confuso de ler sua dúvida.
macario1983:
Foi mau, desse jeito esta melhor?
Rodrigo_Sasaki

Melhor, mas não ideal…

A tag quote é usada para citar algo que já foi dito por alguém, se você está escrevendo coisas “novas” no seu post, como estou fazendo agora, simplesmente deixe fora das tags.

nel

Leia a API, passei o link dela logo acima. O containsKey não lança exceção, peço perdão. Já alterei o post acima.
Isso ali é apenas uma validação, ele te retorna um booleano.

Não, o Map não aceita chaves duplicadas, ele substitui o valor da existente. Se precisa de valores repetidos, é outro modelo de implementação.
Curiosidade, porque não posta só o seu objeto Agenda e Telefone, como está atualmente ?

M

nel:
Leia a API, passei o link dela logo acima. O containsKey não lança exceção, peço perdão. Já alterei o post acima.
Isso ali é apenas uma validação, ele te retorna um booleano.

Não, o Map não aceita chaves duplicadas, ele substitui o valor da existente. Se precisa de valores repetidos, é outro modelo de implementação.
Curiosidade, porque não posta só o seu objeto Agenda e Telefone, como está atualmente ?

package model;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import exception.TelefoneDuplicadoException;

public class Telefones {

	private Map<Integer, String> telefones;
	private final String naoEncontrado = "Telefone não encontrado";
	private int indice = 1;

	public Telefones() {

		telefones = new HashMap<Integer, String>();
	}

	public void adcionarTelefone(String telefone) {

		try {
			if (telefoneExiste(telefone)) {
				throw new TelefoneDuplicadoException();
			}
			telefones.put(new Integer(indice), telefone);
			System.out.println("Telefone adicionado");
			indice++;
		} catch (TelefoneDuplicadoException e) {
			System.err.println(e.getMessage());
		}
	}

	public void alterarTelefone(String velho_Tel, String novo_Tel) {

		int indice = pesquisarTelefone(velho_Tel);

		try {
			if (indice != -1) {
				if (telefoneExiste(novo_Tel)) {
					throw new TelefoneDuplicadoException();
				}
				telefones.put(indice, novo_Tel);
				System.out.println("Telefone alterado");
			} else {
				System.out.println(naoEncontrado);
			}
		} catch (TelefoneDuplicadoException e) {
			System.err.println(e.getMessage());
		}
	}

	public void removerTelefone(String tel) {

		int indice = pesquisarTelefone(tel);
		if (indice != -1) {
			telefones.remove(indice);
			System.out.println("Telefone removido");
		} else {
			System.out.println(naoEncontrado);
		}
	}

	public int pesquisarTelefone(String arg) {

		for (Entry<Integer, String> telefone : telefones.entrySet()) {
			if (telefone.getValue().equals(arg)) {
				return telefone.getKey();
			}
		}
		return -1;
	}

	public void mostrar() {

		StringBuilder texto = new StringBuilder();
		int tamanhoMaximo = telefones.size();

		for (Entry<Integer, String> telefone : telefones.entrySet()) {

			texto.append(telefone.getKey() + "=" + telefone.getValue());

			if (telefone.getKey() < tamanhoMaximo) {
				texto.append(" --- ");
			} else {
				texto.append(" ");
			}
		}
		System.out.println(texto);
	}

	private boolean telefoneExiste(String tel) {

		return telefones.containsValue(tel);

	}

}

Eu ainda não fiz o codigo total da classe Contato e Agenda…

Uma duvida que tive ao executar meu codigo…

Minha classe main ta assim…

package visao;

import model.Telefones;

public class Principal {
	
	
	public static void main(String[] args) {
		
		Telefones lista = new Telefones();
		
		lista.adcionarTelefone("190");
		lista.adcionarTelefone("100");
		lista.adcionarTelefone("120");
		lista.adcionarTelefone("190");
		lista.mostrar();
		lista.alterarTelefone("100","200");
		lista.mostrar();
		lista.alterarTelefone("200","120");
		lista.mostrar();
		lista.removerTelefone("200");
		lista.mostrar();
	}

}

E a saída fica impressa assim pra mim
Porque?

Telefone já cadastrado
Telefone já cadastrado
Telefone adicionado
Telefone adicionado
Telefone adicionado
1=190 — 2=100 — 3=120
Telefone alterado
1=190 — 2=200 — 3=120
1=190 — 2=200 — 3=120
Telefone removido
1=190 — 3=120

Esta fora da ordem da logica da main…

nel

Cara, vou te perguntar mais uma vez. Porque um objeto Telefone possui vários Telefones ?
Não te soa estranho isso ?

Pensa, você tem uma Agenda e nessa agenda você pode ter um ou mais telefones, concorda ?
Não seria correto tu fazer algo como:

public class Agenda {

   private Map<Integer, String> telefones;
}

O que você acha ?

M
nel:
Cara, vou te perguntar mais uma vez. Porque um objeto Telefone possui vários Telefones ? Não te soa estranho isso ?

Pensa, você tem uma Agenda e nessa agenda você pode ter um ou mais telefones, concorda ?
Não seria correto tu fazer algo como:

public class Agenda {

   private Map<Integer, String> telefones;
}

O que você acha ?

Concordo com vc, mas eu to com dificuldade na modelagem pelo seguinte fato...

Acho que isso pra quem é iniciante complica um pouco

Eu to fazendo assim

Um hashmap de telefones
Um hashmap de contatos
E ai vou ajuntar os 2 no hashmap agenda...

agenda < contato, telefones>

meu problema ta sendo imaginar a modelagem ate pelo fato de deixar a classe muito extensa porque pretendo implementar metodos adicionar, pesquisar, remover...

nel

Veja, a Agenda possui outras definições, outros objetos, então eu diria para deixar a modelagem dela para o final.
Se tu quer ter contatos e telefones, pense nas classes Contato e Telefone (não usei plural, prestou atenção?).

Modelando ambas, o que elas devem ter em termos de atributos, não pense em ações no momento. O que um objeto Contato precisa ? O que um objeto Telefone precisa ?
Eu diria um atributo bem básico para cada um:

public class Contato {
   private String nome;
}

public class Telefone {
   private String numero;
}

Depois de definido os atributos "básicos" de cada objeto, você pode pensar no básico do seu objeto Agenda, para dar continuidade a modelagem. Vamos lá, pensando de forma bem básica, uma Agenda pode conter N contatos e N telefones. Se estou falando que são N, sendo n >= 0, significa que terei uma lista. Então:

public class Agenda {
   private List<Contato> contato;
   private List<Telefone> telefones;
}

Opa, agora eu estou dizendo que com a minha Agenda em mãos, posso resgatar meus contatos e meus telefones. Mas espera, um telefone pertence a uma agenda ou a um contato ? Eu penso que pertence a um contato. Um contato tem apenas um telefone? Não, ele pode ter vários. Uma agenda, tem apenas um contato? É claro que não, podemos ter N contatos. Agora, precisamos apenas remodelar isso, então:

public class Contato {
   private String nome;
   private List<Telefone> telefones;
}

public class Agenda {
   private List<Contato> contatos;
}

E tenta ir seguindo essa linha de raciocínio, sem afobação. Se tentar solucionar tudo de uma única vez e lançar em código, pode se atrapalhar. Vai analisando as tuas necessidades e aplicando elas, modelando. Acredito que o resultado final será satisfatório.

M
nel:
Veja, a Agenda possui outras definições, outros objetos, então eu diria para deixar a modelagem dela para o final. Se tu quer ter contatos e telefones, pense nas classes Contato e Telefone (não usei plural, prestou atenção?).

Modelando ambas, o que elas devem ter em termos de atributos, não pense em ações no momento. O que um objeto Contato precisa ? O que um objeto Telefone precisa ?
Eu diria um atributo bem básico para cada um:

public class Contato {
   private String nome;
}

public class Telefone {
   private String numero;
}

Depois de definido os atributos "básicos" de cada objeto, você pode pensar no básico do seu objeto Agenda, para dar continuidade a modelagem. Vamos lá, pensando de forma bem básica, uma Agenda pode conter N contatos e N telefones. Se estou falando que são N, sendo n >= 0, significa que terei uma lista. Então:

public class Agenda {
   private List<Contato> contato;
   private List<Telefone> telefones;
}

Opa, agora eu estou dizendo que com a minha Agenda em mãos, posso resgatar meus contatos e meus telefones. Mas espera, um telefone pertence a uma agenda ou a um contato ? Eu penso que pertence a um contato. Um contato tem apenas um telefone? Não, ele pode ter vários. Uma agenda, tem apenas um contato? É claro que não, podemos ter N contatos. Agora, precisamos apenas remodelar isso, então:

public class Contato {
   private String nome;
   private List<Telefone> telefones;
}

public class Agenda {
   private List<Contato> contatos;
}

E tenta ir seguindo essa linha de raciocínio, sem afobação. Se tentar solucionar tudo de uma única vez e lançar em código, pode se atrapalhar. Vai analisando as tuas necessidades e aplicando elas, modelando. Acredito que o resultado final será satisfatório.

Show de bola sua lógica cara...

É, vc tem total razão...

Vou tentar aplicar sob sua otica...

E depois mostro o resultado

Obrigado

Criado 24 de julho de 2012
Ultima resposta 24 de jul. de 2012
Respostas 15
Participantes 4