Guide for Passant llista


Això és una guia per ajudar-te a començar amb aquest problema — no és la solució.
Mostra el codi per a: Consideracions generals Java 11 Python 3

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:

  1. 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.
  2. 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.
  3. Ordena la llista de persones per cognom, i quan coincideixi el cognom, per nom.
  4. 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);
            }
        }
    }
}

Tornar al problema