Riepilogo - Contatore della frequenza delle parole
Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 30 di 68.
Sfida
FacileCrea uno strumento di analisi del testo che conti la frequenza delle parole in un documento. Questa sfida dimostra come le mappe siano efficaci nell'aggregare dati, tenendo traccia del numero di volte in cui compare ogni parola unica in un testo.
Riceverai due input:
- Una stringa che rappresenta il testo da analizzare (ad esempio,
"the quick brown fox jumps over the lazy dog the fox is quick") - Una stringa che rappresenta la soglia minima di frequenza (ad esempio,
"2")
Importante: Il testo di input può contenere spazi, quindi devi leggere l'intera riga usando bufio.NewReader con ReadString('\n') oppure un bufio.Scanner: non usare fmt.Scanln per l'input di testo, perché interrompe la lettura al primo spazio.
Il tuo compito è:
- Creare una funzione chiamata
countWordsche accetta una stringa di testo e restituisce unamap[string]int, in cui:- Le chiavi sono singole parole (stringhe)
- I valori sono la frequenza di ciascuna parola (numeri interi)
- Analizzare il testo di input suddividendolo in singole parole usando
strings.Fields(che suddivide in corrispondenza di qualsiasi spazio vuoto) - Contare la frequenza di ogni parola nel testo:
- Convertire tutte le parole in minuscolo per ottenere un conteggio coerente
- Per ogni parola, incrementare il suo conteggio nella mappa
- Se una parola non è ancora presente nella mappa, il suo valore iniziale sarà 0 e verrà incrementato a 1
- Filtrare i risultati per mostrare solo le parole che compaiono almeno tante volte quanto indicato dalla soglia
- Visualizzare i risultati nel seguente formato:
- Intestazione:
"Word Frequency Analysis:" - Per ogni parola che soddisfa i requisiti:
"[word]: [count]" - Visualizzare le parole in ordine alfabetico
- Intestazione:
- Calcolare e visualizzare le statistiche riepilogative:
"Total unique words: [total_unique_count]""Words above threshold: [filtered_count]""Most frequent word: [word] ([count] times)"- Quando più parole hanno lo stesso conteggio massimo, riportare quella che viene prima in ordine alfabetico. Se ogni parola compare una sola volta, è semplicemente la prima parola dell'elenco ordinato.
Ad esempio, dati il testo di input "hello hello world" e la soglia "2", l'output dovrebbe essere:
Word Frequency Analysis: hello: 2 Total unique words: 2 Words above threshold: 1 Most frequent word: hello (2 times)
Usa il pacchetto bufio per leggere intere righe di input, il pacchetto strings per suddividere il testo e convertirlo in minuscolo, il pacchetto strconv per convertire la stringa della soglia in un numero intero e il pacchetto sort per ordinare le parole alfabeticamente. Questa sfida dimostra come le mappe offrano una soluzione efficace per contare e aggregare dati, e come il comportamento del valore zero delle mappe renda la logica di conteggio semplice ed efficiente.
Provalo tu
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Leggi l'intera riga di testo (inclusi gli spazi)
scanner.Scan()
text := scanner.Text()
// Leggi il valore di soglia
scanner.Scan()
thresholdStr := scanner.Text()
// Converti threshold in un numero intero
threshold, _ := strconv.Atoi(thresholdStr)
// TODO: Scrivi il tuo codice qui sotto
// 1. Crea la funzione countWords che restituisce un map[string]int
// Suggerimento: usa strings.Fields e strings.ToLower per separare e normalizzare le parole
// 2. Usa la funzione per contare le occorrenze delle parole
// 3. Filtra le parole che compaiono almeno 'threshold' volte
// 4. Ordina alfabeticamente le parole filtrate e visualizzale
// 5. Calcola e visualizza le statistiche riepilogative
_ = text
_ = threshold
fmt.Println("Word Frequency Analysis:")
}Tutte le lezioni di Logica e flusso
1Flusso di controllo avanzato
Switch con `fallthrough`Uscire dai cicli annidatiContinuare un ciclo specificoL'istruzione `goto`Riepilogo - Controllo avanzato dei cicli4Progetto: semplice lista di attività
Configurazione del progettoAggiungere un’attività2Struct e metodi
Definire metodi sugli structReceiver per valoreReceiver con puntatoreScegliere i receiverMetodi vs funzioniRiepilogo - comportamento degli struct5Mappe in dettaglio
Mappe di structPuntatori come valori delle mappeVerificare le mappe nilConfrontare le mappeRiepilogo - Contatore della frequenza delle parole3Interfacce (le basi)
Che cos’è un’interfaccia?Definire un’interfacciaImplementare un’interfacciaUsare i tipi interfacciaInterfaccia vuotaAsserzioni di tipoSwitch di tipoRiepilogo: forme e comportamentiEsercitati da solo: Compilatore Go online