Alterar valor de um Set [Resolvido]

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!

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

[quote=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[/quote]

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

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.

[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

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.

[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;

[quote]
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.[/quote]

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

[code]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”);
[/code]

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.

[quote=nel][code]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”);
[/code]

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

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.

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 ?

[quote=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 ?[/quote]



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…

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:

[code]public class Agenda {

private Map<Integer, String> telefones;
}[/code]

O que você acha ?

[quote=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:

[code]public class Agenda {

private Map<Integer, String> telefones;
}[/code]

O que você acha ?[/quote]

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…

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:

[code]public class Contato {
private String nome;
}

public class Telefone {
private String numero;
}[/code]

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:

[code]public class Contato {
private String nome;
private List telefones;
}

public class Agenda {
private List contatos;
}[/code]

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.

[quote=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:

[code]public class Contato {
private String nome;
}

public class Telefone {
private String numero;
}[/code]

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:

[code]public class Contato {
private String nome;
private List telefones;
}

public class Agenda {
private List contatos;
}[/code]

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.[/quote]

Show de bola sua lógica cara…

É, vc tem total razão…

Vou tentar aplicar sob sua otica…

E depois mostro o resultado

Obrigado