Dúvida de Iniciante + LinkedHashMap

11 respostas
S

Olá tenho o seguinte código ou parte dele, desculpem se esta falatando algo, mas tentei ser o objetivo a minha duvida:

public class Trabalhador {
	int idade, id;
	
	public void setIdade(int idade) {
		this.idade = idade;
	}
	
	public int getIdade() {
		return this.idade;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	
	public int getId() {
		return this.id;
	}
}

public class Boss {
	
	LinkedHashMap<String, Trabalhador> trabalhadorList = new LinkedHashMap<String, Trabalhador>();
	
	public void registrar(Trabalhador trabalhador) {
		trabalhadorList.put(trabalhador);
	}
	
	public void atualizarIdade(int id, int idade) {
		Trabalhador t = trabalhaodorList.get(id);
		t.setIdade(idade);
	}
}

public class BigBoss {

	Boss boss;
	
	public BigBoss(Boss boss) {
		this.boss = boss;
	}
	
	public atualizar(int id, int idade) {
		Trabalhador t = boss.trabalhadorList.get(id);
		t.setIdade(idade);
	}
}

A minha dúvida esta nos metodos atualizarIdade e atualizar. É necessário ter um put em cada método? o que esta errado?

11 Respostas

mauricioadl
public void atualizarIdade(int id, int idade) {

Trabalhador t = trabalhaodorList.get(id);

t.setIdade(idade);

}

sim, pois quando vc usa o get(id) vc pega uma copia do objeto trabalhador, e a alteração que vc faz nele nao surte efeito na lista.

aechiara

spiderman:
Olá tenho o seguinte código ou parte dele, desculpem se esta falatando algo, mas tentei ser o objetivo a minha duvida:

public class Trabalhador {
	int idade, id;
	
	public void setIdade(int idade) {
		this.idade = idade;
	}
	
	public int getIdade() {
		return this.idade;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	
	public int getId() {
		return this.id;
	}
}

public class Boss {
	
	LinkedHashMap<String, Trabalhador> trabalhadorList = new LinkedHashMap<String, Trabalhador>();
	
	public void registrar(Trabalhador trabalhador) {
		trabalhadorList.put(trabalhador);
	}
	
	public void atualizarIdade(int id, int idade) {
		Trabalhador t = trabalhaodorList.get(id);
		t.setIdade(idade);
	}
}

public class BigBoss {

	Boss boss;
	
	public BigBoss(Boss boss) {
		this.boss = boss;
	}
	
	public atualizar(int id, int idade) {
		Trabalhador t = boss.trabalhadorList.get(id);
		t.setIdade(idade);
	}
}

A minha dúvida esta nos metodos atualizarIdade e atualizar. É necessário ter um put em cada método? o que esta errado?

no atualizarIdade, está faltando fazer o put
no registrar, está faltando passar a String

como é um map, vc tem que utilizar o put, mas é um map <chave, valor>
então deveria ser algo do tipo:

trabalhadorList.put("alguma String para usar como chave", trabalhador);

porém, na sua classe Trabalhador, tem um campo ID que acho que vc quer usar como chave, se for esse o caso altere da seguinte maneira:

// ...

LinkedHashMap<int, Trabalhador> trabalhadorList = new LinkedHashMap<int, Trabalhador>();  

public void registrar(Trabalhador trabalhador) {  
        trabalhadorList.put(trabalhador.getId(), trabalhador);  
    }  

public void atualizarIdade(int id, int idade) {  
        Trabalhador t = trabalhaodorList.get(id);  
        t.setIdade(idade);  
		trabalhaodorList.put(trabalhador.getId(), trabalhador);
    }  

// ...
S
public void atualizarIdade(int id, int idade) {    
        Trabalhador t = trabalhaodorList.get(id);    
        t.setIdade(idade);    
        trabalhaodorList.put(trabalhador.getId(), trabalhador);  
    }

Necessariamente eu tenho que ter um put depois de um get, mesmo só tenho um cópia do objeto? Pensei que tendo somente a cópia ele iria atualizar diretamente o objeto original.

mauricioadl

vale lembrar que vai duplicar o objeto. entao sera preciso remover o objeto sem alteração e adicionar o objeto alterado.

rmendes08

Cara, isso é viagem. As implementações padrão das Collection’s não duplicam objetos, é tudo por referência mesmo, sendo assim, se ele quer alterar um objeto-valor da Map basta recuperar o objeto correto e aplicar as alterações.

nel

Cara, isso é viagem. As implementações padrão das Collection’s não duplicam objetos, é tudo por referência mesmo, sendo assim, se ele quer alterar um objeto-valor da Map basta recuperar o objeto correto e aplicar as alterações.

Achei que eu não fosse ler nada coerente. É exatamente isso.

S

Heiiii agora não entendi mais nada, então está correto desta maneira?:

public void atualizarIdade(int id, int idade) {      
        Trabalhador t = trabalhaodorList.get(id);      
        t.setIdade(idade); 
}
rmendes08

spiderman:
Heiiii agora não entendi mais nada, então está correto desta maneira?:

public void atualizarIdade(int id, int idade) { Trabalhador t = trabalhaodorList.get(id); t.setIdade(idade); }

Não, o código está errado. Mas o erro é que você usa um primitivo inteiro para recuperar o objeto quando na verdade a Map espera receber um valor do tipo String como chave, as correções são:

Map<Integer, Trabalhador> trabalhadorList = new LinkedHashMap<Integer, Trabalhador>(); //sempre use a interface

 public void registrar(Trabalhador trabalhador) {  
        trabalhadorList.put(trabalhador.getId(), trabalhador);  //para guardar você tem que passar chave + valor para o put.
  }
S

Ok.Ok. Foi erro meu. Elaborei algo mais concreto.

package testeLinkedHashMap;

public class Aluno {

	int nota;
	int id;
	
	public void setId(int id) {
		this.id = id;
	}
	
	public int getId() {
		return this.id;
	}
	
	public void setNota(int nota){
		this.nota = nota;
	}
	
	public int getNota() {
		return this.nota;
	}
}

package testeLinkedHashMap;

import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashMap;

public class Secretaria {
	
	LinkedHashMap<Integer, Aluno> listaAlunos = new LinkedHashMap<Integer, Aluno>();

	public void addAluno(Aluno aluno) {
		this.listaAlunos.put(aluno.getId(), aluno);
	}
	
	public Aluno getAluno(int id) {
		return this.listaAlunos.get(id);
	}
	
	public void alteraNota(int id, int nota) {
		Aluno aluno = this.listaAlunos.get(id);
		aluno.setNota(nota);
	}
	
	public void print() {
		Collection c = listaAlunos.values();
		Iterator i = c.iterator();
		while (i.hasNext()) {
			Aluno key = (Aluno) i.next();
			System.out.println("Aluno: " + key.getId() + " Nota: " + key.getNota() + "\n");
		}
	}
}

package testeLinkedHashMap;


public class Professor {
	
	Secretaria secretaria;
	
	public Professor(Secretaria secretaria) {
		this.secretaria = secretaria;
	}
	
	public void alteraNota(int id, int nota) {
		Aluno aluno = this.secretaria.getAluno(id);
		aluno.setNota(nota);
	}
}

Agora se o professor executar o método alteraNota e não a secretaria, minha dúvida é, como o objeto professor possui uma “cópia” do objeto aluno a nota se altera mesmo assim no objeto “original” que se encontra na lista da secretaria?

mauricioadl

sim altera, eu me enganei. malz!!!

nel

spiderman:
Ok.Ok. Foi erro meu. Elaborei algo mais concreto.

package testeLinkedHashMap;

public class Aluno {

	int nota;
	int id;
	
	public void setId(int id) {
		this.id = id;
	}
	
	public int getId() {
		return this.id;
	}
	
	public void setNota(int nota){
		this.nota = nota;
	}
	
	public int getNota() {
		return this.nota;
	}
}

package testeLinkedHashMap;

import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashMap;

public class Secretaria {
	
	LinkedHashMap<Integer, Aluno> listaAlunos = new LinkedHashMap<Integer, Aluno>();

	public void addAluno(Aluno aluno) {
		this.listaAlunos.put(aluno.getId(), aluno);
	}
	
	public Aluno getAluno(int id) {
		return this.listaAlunos.get(id);
	}
	
	public void alteraNota(int id, int nota) {
		Aluno aluno = this.listaAlunos.get(id);
		aluno.setNota(nota);
	}
	
	public void print() {
		Collection c = listaAlunos.values();
		Iterator i = c.iterator();
		while (i.hasNext()) {
			Aluno key = (Aluno) i.next();
			System.out.println("Aluno: " + key.getId() + " Nota: " + key.getNota() + "\n");
		}
	}
}

package testeLinkedHashMap;


public class Professor {
	
	Secretaria secretaria;
	
	public Professor(Secretaria secretaria) {
		this.secretaria = secretaria;
	}
	
	public void alteraNota(int id, int nota) {
		Aluno aluno = this.secretaria.getAluno(id);
		aluno.setNota(nota);
	}
}

Agora se o professor executar o método alteraNota e não a secretaria, minha dúvida é, como o objeto professor possui uma “cópia” do objeto aluno a nota se altera mesmo assim no objeto “original” que se encontra na lista da secretaria?

Não se usa tipos primitivos na API Collections, inclusive, tente criar com um , para ver. Aceita Objetos e somente Objetos, portanto, se você declarou o Wrapper Integer, não considere a chave sendo um int, mas também um Integer. Não se trata de cópia de objeto mas de referência colega. O Map terá armazenado uma referência do objeto X, portanto, qualquer ação sofrida por esse objeto X, o mesmo acontece na referência que está no Map. Por isso, quando você realiza o get(key) e altera o objeto, é totalmente desnecessário realizar o put(object) novamente.

Criado 12 de abril de 2012
Ultima resposta 12 de abr. de 2012
Respostas 11
Participantes 5