> For the complete documentation index, see [llms.txt](https://educacion.gitbook.io/programacion/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://educacion.gitbook.io/programacion/exercicios-java/ud6-solucions/mapas-map-e-hashmap.md).

# Mapas: Map e HashMap

1. Contador de palabras

```java
package Lector;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class ContadorPalabras {

        public static void main(String [] args){
            String ficheiroEntrada = "C:\\Users\\mri\\Desktop\\Fichero.txt";
            Map<String, Integer> contador = new HashMap<String, Integer>();
            //Leemos el fichero y almacenamos el contenido en una lista de Arrays
            try (BufferedReader lector = new BufferedReader(new FileReader(ficheiroEntrada))) {
                String linea;
                while ((linea = lector.readLine()) != null) {
                    //Almacenamos las palabras leidas en el orden de lectura
                    String[] palLinea = linea.split(" ");
                    for (String palabra : palLinea) {
                        //Eliminamos los caracteres de las palabras
                        String pal = palabra.replaceAll("[^0-9A-Za-záéíóúÁÉÍÓÚÑñ]", "");
                        if (contador.containsKey(pal)) {
                            contador.put(pal, contador.get(pal) + 1);
                        } else {
                            contador.put(pal, 1);
                        }
                    }
                }
            } catch (IOException e) {
                System.out.println("Error en el proceso:" + e.getMessage());
            }
                //Escribimos el contenido por pantalla
            for (String clave: contador.keySet()){
                System.out.println(clave + " : " + contador.get(clave));
            }
            System.out.println("El programa ha finalizado correctamente.");
        }

}

```

1. Alumnos e votos

```java
package Map;

import java.util.Objects;

public class Alumno {
    private String dni;
    private String nome;

    public Alumno(String dni, String nome) {
        this.dni = dni;
        this.nome = nome;
    }

    public String getDni() {
        return dni;
    }

    public void setDni(String dni) {
        this.dni = dni;
    }

    public String getNome() {
        return nome;
    }

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

    @Override
    public String toString() {
        return nome + " - " + dni;
    }

    // Importante para que as coleccións identifiquen alumnos repetidos polo DNI
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Alumno))
            return false;
        Alumno alumno = (Alumno) o;
        return dni.equals(alumno.dni);
    }

    @Override
    public int hashCode() {
        return Objects.hash(dni);
    }
}

```

```java
package Map;

import java.util.*;

public class Urna {

    private Set<Alumno> votantes;
    private Map<Alumno, Integer> resultados;

    public Urna() {
        this.votantes = new HashSet<>();
        this.resultados = new HashMap<>();
    }

    public boolean votar(Alumno candidato, Alumno votante) {

        if (votantes.contains(votante)) {
            return false;
        }

        votantes.add(votante);

        if (resultados.containsKey(candidato)) {
            int votosActuais = resultados.get(candidato);
            resultados.put(candidato, votosActuais + 1);
        } else {
            resultados.put(candidato, 1);
        }
        return true;
    }

    public int recuperarVotos(Alumno candidato) {
        if (resultados.containsKey(candidato)) {
            return resultados.get(candidato);
        }
        return 0;
    }

    public String toString() {
        StringBuilder sb = new StringBuilder();

        // Percorrido manual de votantes
        sb.append("Votantes: [ ");
        Iterator<Alumno> itVot = votantes.iterator();
        while (itVot.hasNext()) {
            sb.append(itVot.next().toString());
            if (itVot.hasNext()) sb.append(", ");
        }
        sb.append(" ]\n");

        // Percorrido manual de candidatos (Map)
        sb.append("Candidatos: [ ");
        int cont = 0;
        for (Alumno candidato : resultados.keySet()) {
            sb.append(candidato.getNome()).append(": ").append(resultados.get(candidato));
            if (cont < resultados.size() - 1) sb.append(", ");
            cont++;
        }
        sb.append(" ]");

        return sb.toString();
    }
}

```

```java
package Map;

public class App {
    public static void main(String[] args) {
        Urna urna = new Urna();

        // Crear 6 alumnos
        Alumno a1 = new Alumno("111A", "Ana");
        Alumno a2 = new Alumno("222B", "Braiz");
        Alumno a3 = new Alumno("333C", "Carla");
        Alumno a4 = new Alumno("444D", "Daniel");
        Alumno a5 = new Alumno("555E", "Elena");
        Alumno a6 = new Alumno("666F", "Fernando");

        // Simulación de votos
        urna.votar(a1, a2); // Brais vota por Ana
        urna.votar(a1, a3); // Carla vota por Ana
        urna.votar(a2, a1); // Ana vota por Brais
        urna.votar(a4, a5); // Elena vota por Daniel
        urna.votar(a4, a6); // Fernando vota por Daniel
        urna.votar(a4, a4); // Daniel vótase a si mesmo

        // Proba: Votar dúas veces (Ana intenta votar de novo por Daniel)
        System.out.println("Ana vota de novo? " + (urna.votar(a4, a1) ? "Si" : "Non (Xa votou)"));

        // Proba: Recuperar votos dun candidato específico
        System.out.println("Votos de Daniel: " + urna.recuperarVotos(a4));
        System.out.println("Votos de Elena (non foi votada): " + urna.recuperarVotos(a5));

        Alumno a7 = new Alumno("111A", "Ana");
        System.out.println("Votos de Ana (alumno): " + urna.recuperarVotos(a7));
        System.out.println("O alumno A7 pode votar: " + urna.votar(a7, a7));


        // Mostrar resultados finais
        System.out.println("\n--- ESTADO FINAL DA URNA ---");
        System.out.println(urna.toString());

    }
}

```

```
// CON EQUALS Y HASHCODE: Cada alumno pode votar unicamente unha vez
Ana vota de novo? Non (Xa votou)
Votos de Daniel: 3
Votos de Elena (non foi votada): 0
Votos de Ana (alumno): 2
O alumno A7 pode votar: false

--- ESTADO FINAL DA URNA ---
Votantes: [ Fernando - 666F, Elena - 555E, Daniel - 444D, Braiz - 222B, Carla - 333C, Ana - 111A ]
Candidatos: [ Daniel: 3, Ana: 2, Braiz: 1 ]

//SIN EQUALS Y HASHCODE: El objeto con los mismos atributos no existe 
//en las estructuras con lo que puede votr dos veces
Ana vota de novo? Non (Xa votou)
Votos de Daniel: 3
Votos de Elena (non foi votada): 0
Votos de Ana (alumno): 0
O alumno A7 pode votar: true

--- ESTADO FINAL DA URNA ---
Votantes: [ Carla - 333C, Daniel - 444D, Braiz - 222B, Elena - 555E, Ana - 111A, Ana - 111A, Fernando - 666F ]
Candidatos: [ Daniel: 3, Braiz: 1, Ana: 2, Ana: 1 ]

```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://educacion.gitbook.io/programacion/exercicios-java/ud6-solucions/mapas-map-e-hashmap.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
