Guide for Passant llista
Com abordar aquest problema
Se't dona una llista de "Nom Cognom", un per línia, i has d'imprimir-los ordenats pel cognom (i \ pel nom si hi ha empat de cognom). A l'hora d'imprimir cada persona, només cal afegir el cognom si \ el seu nom de pila no és únic dins de tota la classe; si el nom ja identifica clarament a la \ persona, n'hi ha prou amb el nom.
Idea general:
- Llegeix totes les línies de l'entrada (fins que s'acabi), separant cada una en nom i cognom, i \ guarda-les totes en una llista.
- Fes servir una estructura de tipus taula de hash (un diccionari /
HashMap) per comptar quantes \ vegades apareix cada nom de pila dins de tota la llista. - Ordena la llista de persones per cognom, i quan coincideixi el cognom, per nom.
- Recorre la llista ja ordenada: per cada persona, si el comptador del seu nom és més gran que 1, \ imprimeix "Nom Cognom"; si és 1, imprimeix només el "Nom".
Paranys habituals:
- Cal fer el recompte de noms sobre tota la llista abans de decidir què s'imprimeix per a cada \ persona (no es pot decidir mirant-ne només una part).
- L'ordenació és pel cognom; el nom només es fa servir per desempatar quan dos cognoms coincideixen.
- L'entrada pot tenir fins a 200 línies i no se't diu explícitament quantes seran: llegeix fins que \ s'acabi l'entrada.
Pista per a Java
Guarda cada persona en una petita classe, compta els noms de pila amb un HashMap<String, \
Integer>, i ordena la llista amb un Comparator que compari primer pel cognom i després pel nom:
import java.util.*;
public class Main {
static class Persona {
String nom, cognom;
Persona(String nom, String cognom) {
this.nom = nom;
this.cognom = cognom;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<Persona> persones = new ArrayList<>();
Map<String, Integer> comptadorNoms = new HashMap<>();
while (sc.hasNextLine()) {
String linia = sc.nextLine().trim();
if (linia.isEmpty()) continue;
String[] parts = linia.split("\\s+");
String nom = parts[0], cognom = parts[1];
persones.add(new Persona(nom, cognom));
comptadorNoms.merge(nom, 1, Integer::sum);
}
persones.sort(Comparator.<Persona, String>comparing(p -> p.cognom)
.thenComparing(p -> p.nom));
for (Persona p : persones) {
if (comptadorNoms.get(p.nom) > 1) {
System.out.println(p.nom + " " + p.cognom);
} else {
System.out.println(p.nom);
}
}
}
}