Java - como listar e atualizar valores do HashMap

25 respostas Resolvido
poojava
C
package CRUD;

public class Funcionário {
  
  private String nome;
  private String CPF;
  private String telefone;
  private int idade;
  
  public String getNome() {
    return nome;
  }

  public void setNome(String nomeF) {
    nome = nomeF;
  }

  public String getCPF() {
    return CPF;
  }

  public void setCPF(String CPFf) {
    CPF = CPFf;
  }

  public String getTelefone() {
    return telefone;
  }

  public void setTelefone(String telefoneF) {
    telefone = telefoneF;
  }
  
  public int getIdade() {
    return idade;
  }

  public void setIdade(int idadeF) {
    idade = idadeF;
  }

  public void venderProdutos() {

  }

  public void registrarNovosClientes() {

  }
}
package CRUD;

import java.util.HashMap;
import java.util.Scanner;
import java.util.Map;

public class Principal {
  
  public static void main (String [] args) {
    Funcionário func1 = new Funcionário();
    HashMap<String, Funcionário> colecaoFuncionários = new HashMap<>();
    Map<String, String> Funcionário = new HashMap<String, String>();
    
    while (true) {
      System.out.println(" -------- Selecione uma opção -------- ");    
      System.out.println(" 1 -- Cadastrar novo funcionário ");
      System.out.println(" 2 -- Remover um funcionário ");
      System.out.println(" 3 -- Atualizar dados de um funcionário ");
      System.out.println(" 4 -- Lista de funcionarios ");
      System.out.println(" 5 -- Sair \n ");
      
      Scanner input = new Scanner(System.in);
      String j = input.nextLine();
      int alternativa = Integer.parseInt(j);
      
      switch (alternativa) {
        case 1:
          System.out.println(" -- OPÇÃO 1 -- ");    
          
          System.out.println(" Informe o nome do funcionário ");
          func1.setNome(input.nextLine());

          System.out.println(" Informe o CPF do funcionário ");
          func1.setCPF(input.nextLine());

          System.out.println(" Informe o telefone do funcionário ");
          func1.setTelefone(input.nextLine());

          System.out.println(" Informe a idade do funcionário ");
          func1.setIdade(input.nextInt());

          colecaoFuncionários.put(func1.getCPF(), func1);
          System.out.println(" Funcionário cadastrado com sucesso. ");
          break;
        
        case 2:
          System.out.println(" -- OPÇÃO 3 -- "); 
          System.out.println(" Informe o CPF do funcionário a ser removido");
          
          String remove = input.nextLine();
          colecaoFuncionários.remove(remove);
          System.out.println(" Funcionário removido do banco de dados. ");
          break;
        
        case 3:
          System.out.println(" Informe o CPF do funcionário ");
          func1.setCPF(input.nextLine());
        
        case 5:
          System.out.println(" -- OPÇÃO 5 -- ");
        
        default:
          System.out.println(" O sistema foi fechado \n ");
          return;
      }
    }
  }
}

Como faço para conseguir atualizar os valores que insiro no HashMap?
Como faço para listar na tela esses valores ?

25 Respostas

L
Solucao aceita

No Map, se vc executar um put com uma chave que já existe, o valor será sobrescrito:

Map<String, String> meuMap = new HashMap<String, String>();
meuMap.put("chaveA", "valorA");
// valor de "chaveA" é "valorA"
meuMap.put("chaveA", "valorB");
// valor de "chaveA" mudou para "valorB"
C

Eu não entendi completamente, digamos que eu queira mudar um valor (CPF em especifico), valorA séria o número do CPF, então, qual séria a chaveA?

L

Se o CPF mudar, então acaba sendo um registro novo. Nesse caso, vc teria que remover o CPF antigo do map.

C

Nesse caso, eu entendo que devo responder assim :

case 3:

System.out.println(" Informe o CPF do funcionário ");

Map<String, String> map = new HashMap<String, String>();

map.put(CPF,  func1.setCPF(input.nextLine()));

Eu não entendo tanto de Java, sou um iniciante, então estou aprendendo aos poucos com os erros. O programa está dando erro(void, um valor vazio) dessa forma, pq na parte do func1, não há um valor predeterminado, já que antes disso, eu tenho que pedir ao usuário para inserir o valor.

P

Não, não vais criar novamente um map aqui.Deves utilizar o global.

Eu faria algo assim:

case 3: 
      System.out.println(" Informe o CPF do funcionário ");
      Funcionario func = map.get(input.nextLine());
      if (func == null){
          System.out.println("Funcionário não encontrado");
          continue;
      }
      System.out.println(" Informe o novo nome do funcionário (enter para manter "+func.getNome()+") ");
      String temp = input.nextLine();
      if (!temp.trim().isEmpty()) {
         func.setNome(temp);
      }
      System.out.println(" Informe o novo telefone do funcionário (enter para manter "+func.getTelefone()+")");
      temp = input.nextLine();
      if (!temp.trim().isEmpty()) {
         func.setTelefone(temp);
      }

      System.out.println(" Informe a nova idade do funcionário (enter para manter "+func.getIdade()+")");
      temp = input.nextLine();
      if (!temp.trim().isEmpty()) {
         func.setIdade(temp);
      }
      break;
C

C

Está dando esse erro.

C


Após algumas mudanças, esse é o erro.

C

Todo o código até o momento :

Parte 1:

package CRUD;

public class Funcionário {

private String nome;

private String CPF;

private String telefone;

private int idade;
public String getNome() {
    return nome;
}

public void setNome(String nomeF) {
    nome = nomeF;
}

public String getCPF() {
    return CPF;
}

public void setCPF(String CPFf) {
    CPF = CPFf;
}

public String getTelefone() {
    return telefone;
}

public void setTelefone(String telefoneF) {
    telefone = telefoneF;
}


public int getIdade() {
    return idade;
}

public void setIdade(int idadeF) {
    idade = idadeF;
}

void setIdade(String temp) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

}

Parte 2:

package CRUD;

import java.util.HashMap;

import java.util.Scanner;

import java.util.Map;

public class Principal {

public static void main (String [] args)
{

Funcionário func1 = new Funcionário();

HashMap<String, Funcionário> colecaoFuncionários = new HashMap<>();

Map<String, String> map = new HashMap<String, String>();

while (true){

System.out.println(" -------- Selecione uma opção -------- “);

System.out.println(” 1 – Cadastrar novo funcionário “);

System.out.println(” 2 – Remover um funcionário “);

System.out.println(” 3 – Atualizar dados de um funcionário “);

System.out.println(” 4 – Lista de funcionarios “);

System.out.println(” 5 – Sair \n ");
Scanner input = new Scanner(System.in);

String j = input.nextLine();

int alternativa = Integer.parseInt(j);

switch(alternativa){

case 1:

System.out.println(" – OPÇÃO 1 – ");

System.out.println(" Informe o nome do funcionário ");
func1.setNome(input.nextLine());

System.out.println(" Informe o CPF do funcionário ");
func1.setCPF(input.nextLine());

System.out.println(" Informe o telefone do funcionário ");
func1.setTelefone(input.nextLine());

System.out.println(" Informe a idade do funcionário ");
func1.setIdade(input.nextInt());

colecaoFuncionários.put(func1.getCPF(), func1);

System.out.println(" Funcionário cadastrado com sucesso. ");

break;

case 2:

System.out.println(" – OPÇÃO 3 – “);
System.out.println(” Informe o CPF do funcionário a ser removido");

String remove = input.nextLine();

colecaoFuncionários.remove(remove);

System.out.println(" Funcionário removido do banco de dados. ");

break;

case 3:

System.out.println(" Informe o CPF do funcionário “);

Funcionário  func1 = map.get(input.nextLine());

if (func1 == null){

System.out.println(“Funcionário não encontrado”);

continue;

}

System.out.println(” Informe o novo nome do funcionário (enter para manter “+func1.getNome()+”) “);

String temp = input.nextLine();

if (!temp.trim().isEmpty()) {

func1.setNome(temp);

}

System.out.println(” Informe o novo telefone do funcionário (enter para manter “+func1.getTelefone()+”)");

temp = input.nextLine();

if (!temp.trim().isEmpty()) {

func1.setTelefone(temp);

}
System.out.println(" Informe a nova idade do funcionário (enter para manter "+func1.getIdade()+")");
  temp = input.nextLine();
  if (!temp.trim().isEmpty()) {
     func1.setIdade(temp);
  }
  break;

case 5:

System.out.println(" – OPÇÃO 5 – ");

default:

System.out.println(" O sistema foi fechado \n ");

return;

}

}
}}

L

Esse erro diz que a variável func1 já está sendo usada. Por isso vc não consegue declarar ela novamente.

C


Esse erro seria o que ?

L

Provavelmente o map.get está retornando uma String, e está tentando atribuir numa variável de um tipo diferente (Funcionario).

C

Mas Funcionário é considerado do tipo String

L

se vc tem:

public class Funcionario {}

O tipo é Funcionario e não String.

Ao declarar um map assim:

Map<String, Funcionario> funcionarios = new HashMap<String, Funcionario>();

Significa que o mapa mantem as chaves do tipo String e os valores das chaves são do tipo Funcionario, e ao recuperar algum valor desse mapa:

Funcionario f1 = funcionarios.get("chave");

O valor que será retornado é do tipo Funcionario.

C

image

C

image

C


A parte do sistema não reconhecer a chave foi resolvida, o problema agora é que na hora de modificar o nome do funcionário e seus outros dados.
Ou seja, digamos que eu tenho 2 funcionários cadastrados, na hora de modificar os dados do primeiro usuário, na parte do println que mostra se deseja manter o nome( o mesmo vale para os outros dados, como telefone e idade), aparece o nome do último usuário cadastrado, e não o do usuário que eu desejo realizar as modificações.

L

Seu código está estranho, pq vc primeiro recupera o funcionário usando a variável func, e depois atualizar o map usando a variável func1. Evite criar variáveis desnecessárias, pois pode causar confusão no código e erros inesperados na execução.

Quando for postar o código, evite ao máximo mandar imagens do código. É muito mais fácil e melhor de ajudar se vc postar o código diretamente.

C

Primeiro uma dúvida, qual a diferença entre eu usar o Map e o HashMap nesse meu caso?

Eu vi os seguintes exemplos pela internet até o momento:

HashMap<chave, valor> colecao = new HashMap<>();
Map<chave, valor> funcionarios = new HashMap<chave, valor>();

Eu ia mandar mais mensagens ontem para tirar dúvidas, mas descobri que tenho um limite de mensagens por ter uma conta criada a pouco dias.

Meu código eu tenho o objetivo que ele consiga realizar as seguintes ações:

    • Cadastrar um funcionário – Ao meu ver, ele consegue executar essa ação
    • Remover um funcionário – Ao meu ver, ele consegue executar essa ação.
    • Atualizar os dados do Funcionário – Incompleto
    • E listar todos os funcionários e seus dados cadastrados no sistema – Incompleto
    • Fechar o programa Ao meu ver, ele consegue executar essa ação

Dito isso, o código está da seguinte forma:

package CRUD;

public class Funcionário {

  private String nome;
  private String CPF;
  private String telefone;
  private int idade;

  public String getNome() {
    return nome;
  }

  public void setNome(String nomeF) {
    nome = nomeF;
  }

  public String getCPF() {
    return CPF;
  }

  public void setCPF(String CPFf) {
    CPF = CPFf;
  }

  public String getTelefone() {
    return telefone;
  }

  public void setTelefone(String telefoneF) {
    telefone = telefoneF;
  }


  public int getIdade() {
    return idade;
  }

  public void setIdade(int idadeF) {
    idade = idadeF;
  }


  void setIdade(String temp) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  }
}
package CRUD;

import java.util.HashMap;
import java.util.Scanner;

public class Principal {
  
  public static void main (String [] args) {
    Funcionário func1 = new Funcionário();
    HashMap<String, Funcionário> colecaoFuncionários = new HashMap<>();
    
    while (true) {
      System.out.println(" -------- Selecione uma opção -------- ");
      System.out.println(" 1 -- Cadastrar novo funcionário ");
      System.out.println(" 2 -- Remover um funcionário ");
      System.out.println(" 3 -- Atualizar dados de um funcionário ");
      System.out.println(" 4 -- Lista de funcionarios ");
      System.out.println(" 5 -- Sair \n ");
      
      Scanner input = new Scanner(System.in);
      String j = input.nextLine();
      int alternativa = Integer.parseInt(j);
      
      switch (alternativa) {
        case 1:
          System.out.println(" -- OPÇÃO 1 -- ");    

          System.out.println(" Informe o nome do funcionário ");
          func1.setNome(input.nextLine());

          System.out.println(" Informe o CPF do funcionário ");
          func1.setCPF(input.nextLine());


          System.out.println(" Informe o telefone do funcionário ");
          func1.setTelefone(input.nextLine());

          System.out.println(" Informe a idade do funcionário ");
          func1.setIdade(input.nextInt());

          colecaoFuncionários.put(func1.getCPF(), func1);
          System.out.println(" Funcionário cadastrado com sucesso. ");
          break;
        
        case 2:
          System.out.println(" -- OPÇÃO 3 -- "); 
          System.out.println(" Informe o CPF do funcionário a ser removido");

          String remove = input.nextLine();
          colecaoFuncionários.remove(remove);
          System.out.println(" Funcionário removido do banco de dados. ");

          break;
        
        case 3: 
          System.out.println(" Informe o CPF do funcionário ");
          Funcionário  func = colecaoFuncionários.get(input.nextLine());
          
          if (func == null) {
            System.out.println("Funcionário não encontrado");
            continue;
          }
          
          System.out.println(" Informe o novo nome do funcionário (enter para manter "+colecaoFuncionários.get(func.getCPF())+ ")" );
          String temp = input.nextLine();
          
          if (!temp.trim().isEmpty()) {
            func.setNome(temp);
          }
          
          colecaoFuncionários.put(func1.getCPF(), func);
          System.out.println("Dados do funcionário atualizados com sucesso. ");
          break;
        
        case 4:
          System.out.println("Tem-se " + colecaoFuncionários.size() + " funcionários(s) cadastrado(s) no sistema\n");
          break;
        
        case 5:
          System.out.println(" -- OPÇÃO 5 -- ");     
        
        default:
          System.out.println(" O sistema foi fechado \n ");
          return;
      }
    }
  }
}
L

Map é uma interface, enquanto HashMap é uma das implementações de Map. É dessa forma pq há outras implementações além da HashMap, como a TreeMap, por exemplo, que já ordena de forma natural com base nas chaves na medida em que os itens são adicionados.

O mais correto é declarar usando Map, recebendo uma instância de HashMap:

Map<String, Funcionario> myMap = new HashMap<>();
L

Peguei seu código e coloquei algumas observações:

Classe Funcionario

// evite usar nomes de pacotes com letras maiúsculas. Seria melhor se fosse: crud, ou melhor: br.com.sistemaa.crud
package CRUD;

// não use caracteres especiais em nomes de classes. Esse acento não deveria ter aqui
public class Funcionário {

  private String nome;

  // evite criar variaveis com todas as letras em maiusculo
  // o correto é que toda variável comece com letra minúscula
  // apenas "cpf" seria o ideal
  private String CPF;

  private String telefone;
  private int idade;

  public String getNome() {
    return nome;
  }

  // o parâmetro não precisa ter esse "f" no final
  public void setNome(String nomeF) {
    nome = nomeF; // aqui vc poderia apenas fazer assim: this.nome = nome
  }

  public String getCPF() {
    return CPF;
  }

  public void setCPF(String CPFf) {
    CPF = CPFf;
  }

  public String getTelefone() {
    return telefone;
  }

  public void setTelefone(String telefoneF) {
    telefone = telefoneF;
  }


  public int getIdade() {
    return idade;
  }

  public void setIdade(int idadeF) {
    idade = idadeF;
  }

  void setIdade(String temp) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  }
}
L

Classe Principal

// evite usar nomes de pacotes com letras maiúsculas. Seria melhor se fosse: crud, ou melhor: br.com.sistemaa.crud
package CRUD;

import java.util.HashMap;
import java.util.Scanner;

public class Principal {
  
  public static void main (String [] args) {
    // Vc não precisa dessa variável, ele parece não está servindo para muita coisa
    Funcionário func1 = new Funcionário();

    // Essa variável poderia se chamar apenas "funcionarios"
    // pois como está no plural, já indica que são vários
    // Melhor declarar assim: Map<String, Funcionario> funcionarios = new HashMap<>();
    HashMap<String, Funcionário> colecaoFuncionários = new HashMap<>();
    
    // Esse while que vc fez, funciona, porém um "do ... while" funcionaria bem também
    while (true) {
      System.out.println(" -------- Selecione uma opção -------- ");
      System.out.println(" 1 -- Cadastrar novo funcionário ");
      System.out.println(" 2 -- Remover um funcionário ");
      System.out.println(" 3 -- Atualizar dados de um funcionário ");
      System.out.println(" 4 -- Lista de funcionarios ");
      System.out.println(" 5 -- Sair \n ");
      
      // Melhor deixar o Scanner fora do while, pq vc só precisa criar ele uma vez
      // desse jeito ele será recriado a cada iteração do while
      Scanner input = new Scanner(System.in);
      String j = input.nextLine();
      int alternativa = Integer.parseInt(j);
      
      switch (alternativa) {
        case 1:
          // Em vez de declarar o funcionario no início do método
          // faz mais sentido declarar aqui, pois é onde vc irá criar o funcionário
          // Ex.: Funcionario funcionarioCadastro = new Funcionario();

          System.out.println(" -- OPÇÃO 1 -- ");    

          System.out.println(" Informe o nome do funcionário ");
          func1.setNome(input.nextLine());

          System.out.println(" Informe o CPF do funcionário ");
          func1.setCPF(input.nextLine());


          System.out.println(" Informe o telefone do funcionário ");
          func1.setTelefone(input.nextLine());

          System.out.println(" Informe a idade do funcionário ");
          func1.setIdade(input.nextInt());

          colecaoFuncionários.put(func1.getCPF(), func1);
          System.out.println(" Funcionário cadastrado com sucesso. ");
          break;
        
        case 2:
          System.out.println(" -- OPÇÃO 3 -- "); 
          System.out.println(" Informe o CPF do funcionário a ser removido");

          // Tente usar variavel com nomes que explicam melhor o que está acontecendo
          // Ex.: String cpfRemover = input.nextLine();
          String remove = input.nextLine();
          colecaoFuncionários.remove(remove);
          System.out.println(" Funcionário removido do banco de dados. ");

          break;
        
        case 3: 
          System.out.println(" Informe o CPF do funcionário ");

          // Aqui tb poderia ter um nome de variavel mais indicativo
          // Ex.: Funcionario funcionarioAlteracao = funcionarios.get(input.nextLine());
          Funcionário  func = colecaoFuncionários.get(input.nextLine());
          
          if (func == null) {
            System.out.println("Funcionário não encontrado");
            continue;
          }
          
          System.out.println(" Informe o novo nome do funcionário (enter para manter "+colecaoFuncionários.get(func.getCPF())+ ")" );
          String temp = input.nextLine();
          
          if (!temp.trim().isEmpty()) {
            func.setNome(temp);
          }
          
          // Aqui vc tinha usado o CPF do funcionario da variavel "func1", e gravou o funcionario da variável "func"
          colecaoFuncionários.put(func1.getCPF(), func);
          System.out.println("Dados do funcionário atualizados com sucesso. ");
          break;
        
        case 4:
          System.out.println("Tem-se " + colecaoFuncionários.size() + " funcionários(s) cadastrado(s) no sistema\n");
          break;
        
        // Como a opção 5 é de sair, vc nem precisaria declarar
        // Pois, ao entrar com a opção 5, ele iria cair automaticamente na opção default
        case 5:
          System.out.println(" -- OPÇÃO 5 -- ");     
        
        default:
          System.out.println(" O sistema foi fechado \n ");
          return;
      }
    }
  }
}

Dê uma lida nessas anotações e tente alterar seu código. Boa sorte!

C

Pode-se dizer que todo o código está quase pronto, o que falta agora é só estética, e o que eu quero é: Conseguir printar na tela dados(número de telefone, nome, idade…) de um funcionário especifico.
Como que faço isso ? Eu quero digitar o CPF desse funcionário, e na minha tela irá aparecer os seus dados. Dá para realizar isso com Map ou HashMap ?

package sistemaCrud;

class Funcionario {

String nome;

int idade;

String cpf;

String telefone;
public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public int getIdade() {
    return idade;
}

public void setIdade(int idade) {
    this.idade = idade;
}

public String getCpf() {
    return cpf;
}

public void setCpf(String cpf) {
    this.cpf = cpf;
}

public String getTelefone() {
    return telefone;
}

public void setTelefone(String telefone) {
    this.telefone = telefone;
}

package sistemaCrud;

import java.util.HashMap;

import java.util.Map;

import java.util.Scanner;

class Principal {
public static void main (String [] args){

Map<String, Funcionario> colecaoFuncionarios = new HashMap<>();

Scanner input = new Scanner(System.in);

Funcionario f1 = new Funcionario();

while(true){

System.out.println(" — Selecione uma opção — “);

System.out.println(” 1 – Cadastrar um funcionário “);

System.out.println(” 2 – Remover um funcionário “);

System.out.println(” 3 – Atualizar dados de um funcionário “);

System.out.println(” 4 – Listar quantidade de funcionários cadastrados “);

System.out.println(” 5 – Sair");

String j = input.nextLine();
int opcao = Integer.parseInt(j);

switch (opcao){

case 1:

System.out.println(" – Opção 1 --");

System.out.println(" Infome o nome do funcionário “);

f1.setNome(input.nextLine());

System.out.println(” Informe o CPF do funcionário “);

f1.setCpf(input.nextLine());

System.out.println(” Informe a idade do funcionário “);

f1.setIdade(input.nextInt());

System.out.println( Informe o telefone do funcionário ");

f1.setTelefone(input.nextLine());
colecaoFuncionarios.put(f1.getCpf(), f1);

System.out.println(" Funcionário cadastrado com sucesso");

break;
case 2:

System.out.println(" – Opção 2 --");
System.out.println(" Informe o CPF do funcionário a ser removido ");

Funcionario cpfRemover = colecaoFuncionarios.get(input.nextLine());

if (cpfRemover == null){

System.out.println(" Funcionário não encontrado ");
continue;

}
colecaoFuncionarios.remove(cpfRemover);

System.out.println(" Funcionário removido do Banco de Dados ! ");

break;

case 3:

System.out.println(" – Opção 3 – “);
System.out.println(” Informe o CPF do funcionário");

Funcionario funcionarioAlteracao = colecaoFuncionarios.get(input.nextLine());

if (funcionarioAlteracao == null){

System.out.println(" Funcionário não encontrado ");
continue;

}

System.out.println(" Informe o novo nome do funcionário (enter para manter "+f1.nome+ “)” );
String temp = input.nextLine();

if (!temp.trim().isEmpty()) {

funcionarioAlteracao.setNome(temp);

}
colecaoFuncionarios.put(funcionarioAlteracao.getCpf(), f1);

System.out.println("Dados do funcionário atualizados com sucesso. ");

break;
case 4:
System.out.println(" – Opção 4 --");

System.out.println(Tem-se " + colecaoFuncionarios.size() + " funcionário (s) cadastrado(s) no sistema\n);

break;
case 5:

return;

}}}}

L

Implemente o método toString na classe Funcionario. E faça o método retornar os dados do funcionário formatado (concatenado)

C

Em uma classe, pode-se encontrar atributos. Esses atributos são as características que a classe pode apresentar. Sendo assim, eles podem ser alterados de qualquer outra classe, utilizando-se objetos.
Isso é verdade ou falso ?

Criado 30 de dezembro de 2021
Ultima resposta 17 de jan. de 2022
Respostas 25
Participantes 3