Problema de implementaçao do HashMap

Estou implementando uma Agenda Telefonica utilizando um HashMap em que a chave é uma String e o valor é um ArrayList de Pessoas (que contém nome e telefone). O objetivo é separar os contatos em ordem alfábetica, sendo assim a chave do HashMap são as letras do alfabeto.

Estou com dificuldade de criar o método de remover um contato e de consultar.
Processando: Agenda.java…

package Agenda;

import java.util.ArrayList;
import java.util.HashMap;

public class Agenda {

	ArrayList<Pessoa> pessoas;
	HashMap<String, ArrayList<Pessoa>> contatos;
	String[] chaves = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S",
			"T", "U", "V", "W", "Y", "Z" };

	public Agenda() {
		this.pessoas = new ArrayList<Pessoa>();
		this.contatos = new HashMap<String, ArrayList<Pessoa>>();
	}

	public void inicializandoContatos() {
		for (String chave : chaves) {
			contatos.put(chave, pessoas);
		}
		System.out.println("Lista de chaves adicionadas: " + contatos.toString());
	}

	public void adicionarContato(Pessoa pessoa) {
		String chave = null;

		chave = pessoa.getNome().substring(0, 1);
		pessoas = new ArrayList<Pessoa>();

		pessoas.addAll(contatos.get(chave));

		pessoas.add(pessoa);

		if (contatos.containsKey(chave)) {
			contatos.put(chave, pessoas);
		} else {
			System.out.println("Chave não existe!");
		}

	}

	public void remover(String nome) {
		String chave = null;

		if (contatos.containsKey(nome)) {
			for (Pessoa pessoa : pessoas) {
				chave = pessoa.getNome().substring(0, 1);
				if (pessoa.getNome().equals(nome)) {
					contatos.remove(nome);
				}
			}
			System.out.println("Contato removido!");

		} else {
			System.out.println("Contato inxistente!");
		}
	}

	public Pessoa consultar(String nome) {
		return null;
	}

	public String listaContatos() {
		return "[Contatos=" + contatos + "]";

package Agenda; 

public class Main {

	public static void main(String[] args) {

		Agenda agenda = new Agenda();
		agenda.inicializandoContatos();

		Pessoa pessoa;

		pessoa = new Pessoa("Leandro", "9999-9999");
		agenda.adicionarContato(pessoa);

		pessoa = new Pessoa("Bruno", "1111-1111");
		agenda.adicionarContato(pessoa);

		pessoa = new Pessoa("Marcela", "8888-8888");
		agenda.adicionarContato(pessoa);

		pessoa = new Pessoa("Lucia", "6666-6666");
		agenda.adicionarContato(pessoa);

		System.out.println(agenda.listaContatos());
		

		agenda.remover("Leandro"); //ao rodar o código diz que o contato não existe
		System.out.println(agenda.listaContatos()); 
		
	}

Leandro não existe em contatos, contatos é o seu Map, para procurar se o Leandro existe ou não, você precisa pegar a lista de valores da chave L e depois procurar se existe alguma pessoa cujo o atributo nome seja igual a Leandro, caso sim, remover, caso contrário o contato não existe.

1 curtida

Aqui estás a por a MESMA lista em todas as letras. Ou seja, qualquer contacto que adiciones a uma lista, vai estar em todas. Deves criar uma nova lista.

     for (String chave : chaves) {
		contatos.put(chave, new ArrayList<>());
     }

Não faz sentido teres uma propriedade da tua agenda que é a lista de pessoas. Só vais ter as várias listas dentro de cada entrada do hashmap (uma lista por letra).
E isto está a contribuir para que tenhas dificuldade no remover.

Para remover tens de obter a lista de pessoas da letra em questão e depois remover a pessoa dessa lista