Java - como listar e atualizar valores do HashMap

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 ?

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"

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?

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

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.

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;

Está dando esse erro.


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

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;

}

}
}}

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


Esse erro seria o que ?

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

Mas Funcionário é considerado do tipo String

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.

image

image


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.

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.

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