Iterare su una mappa
Fa parte della sezione Logica e flusso del percorso Dart di Coddy. Lezione 26 di 65.
Quando lavori con le raccolte Map, spesso devi elaborare ogni coppia chiave-valore. Il metodo forEach offre un modo semplice per scorrere tutte le voci di una mappa, permettendoti di accedere sia alla chiave sia al valore corrispondente.
Il metodo forEach accetta una funzione come argomento. Questa funzione riceve due parametri: la chiave e il valore di ogni voce nella mappa. Il metodo chiama automaticamente la tua funzione una volta per ogni coppia chiave-valore nella mappa.
Map<String, int> studentScores = {
'Alice': 85,
'Bob': 92,
'Charlie': 78
};
studentScores.forEach((name, score) {
print('$name scored $score points');
});
// Output:
// Alice scored 85 points
// Bob scored 92 points
// Charlie scored 78 pointsQuesto approccio è molto più pratico che accedere manualmente a ogni chiave o provare a scorrere la mappa usando altri metodi. Il metodo forEach gestisce tutta la logica di iterazione al posto tuo, rendendo il codice più pulito e leggibile quando devi elaborare ogni voce di una mappa.
Sfida
FacileCrea un programma che gestisca il sistema di rendicontazione delle vendite giornaliere di un ristorante analizzando le voci del menu e i relativi dati di vendita. Il programma deve:
- Leggere una stringa in input che rappresenta il nome del ristorante
- Leggere più coppie di input che rappresentano le voci del menu e i relativi importi di vendita (l'input terminerà quando riceverai
"sales_done") - Creare una Map per memorizzare ogni voce del menu come chiave e il relativo importo di vendita come valore
- Usare il metodo
forEachper scorrere i dati di vendita e calcolare il ricavo totale - Usare nuovamente il metodo
forEachper individuare la voce più venduta (l'importo di vendita più alto) - Stampare il report delle vendite nel formato esatto mostrato di seguito
Ad esempio, se il nome del ristorante è "Mario's Pizza" e i dati di vendita includono "Margherita Pizza" con 450, "Caesar Salad" con 280, "Garlic Bread" con 320, "Tiramisu" con 180, il programma dovrebbe produrre:
Restaurant: Mario's Pizza
Daily Sales Report:
Margherita Pizza: $450
Caesar Salad: $280
Garlic Bread: $320
Tiramisu: $180
Total Revenue: $1230
Best Selling Item: Margherita Pizza ($450)
Status: Sales report generated successfullySe il nome del ristorante è "Sushi Express" e i dati di vendita includono "California Roll" con 380, "Salmon Sashimi" con 520, "Miso Soup" con 150, il programma dovrebbe produrre:
Restaurant: Sushi Express
Daily Sales Report:
California Roll: $380
Salmon Sashimi: $520
Miso Soup: $150
Total Revenue: $1050
Best Selling Item: Salmon Sashimi ($520)
Status: Sales report generated successfullySe il nome del ristorante è "Burger Palace" e i dati di vendita includono "Classic Burger" con 600, "French Fries" con 400, "Milkshake" con 250, "Onion Rings" con 180, il programma dovrebbe produrre:
Restaurant: Burger Palace
Daily Sales Report:
Classic Burger: $600
French Fries: $400
Milkshake: $250
Onion Rings: $180
Total Revenue: $1430
Best Selling Item: Classic Burger ($600)
Status: Sales report generated successfullyIl programma deve usare il metodo forEach per scorrere le voci della Map. Per prima cosa, usa forEach per visualizzare ogni voce del menu e il relativo importo di vendita, calcolando anche il ricavo totale. Poi usa nuovamente forEach per trovare la voce con l'importo di vendita più alto. Il formato dell'input sarà: nome del ristorante, poi nomi alternati delle voci del menu e relativi importi di vendita (come stringhe da convertire in interi), e terminerà con "sales_done".
Provalo tu
import 'dart:io';
void main() {
// Leggi il nome del ristorante
String? restaurantName = stdin.readLineSync();
// Crea una Map per memorizzare le voci del menu e i relativi importi delle vendite
Map<String, int> salesData = {};
// Leggi le voci del menu e gli importi delle vendite fino a "sales_done"
while (true) {
String? input = stdin.readLineSync();
if (input == "sales_done") {
break;
}
String menuItem = input!;
String? salesAmountStr = stdin.readLineSync();
int salesAmount = int.parse(salesAmountStr!);
salesData[menuItem] = salesAmount;
}
// TODO: Scrivi il tuo codice qui sotto
// Usa forEach per calcolare il ricavo totale e mostrare i dati delle vendite
// Usa di nuovo forEach per trovare la voce più venduta
// Stampa il resoconto delle vendite nel formato richiesto
print("Restaurant: $restaurantName");
print("Daily Sales Report:");
// Mostra ogni voce e calcola il totale
// Trova e mostra la voce più venduta
// Mostra il ricavo totale e lo stato
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Manipolazione avanzata delle liste
Proprietà delle liste: primo e ultimoStato della lista: isEmpty e isNotEmpInvertire una listaAggiungere a una lista: insertRimozione dalla lista: removeWhereRicerca in una lista: indexOfOrdinare una listaMescolare una listaRiepilogo - Organizzatore di liste4Manipolazione avanzata delle mappe
Iterare su una mappaVerificare chiavi e valoriProprietà delle mappe: chiavi e valoriAggiunta condizionale: putIfAbsentRimuovere elementi da una mappaMappe annidateRiepilogo - Aggiornamento dell'inventario2Operazioni funzionali sulle liste
Trasformare con 'map'Filtrare con 'where'Usare '.toList()'Verificare condizioni con 'any'Condizioni con 'every'Trovare con 'firstWhere'Riepilogo - Filtraggio dei dati3Insiemi
Che cos'è un insieme?Creare un insiemeAggiungere e rimuovere elementi dagli insiemiVerificare la presenza di elementi in un insiemeConvertire una lista in un insiemeUnione di insiemiIntersezione di insiemiDifferenza tra insiemiRiepilogo - Lista degli ospiti uniciEsercitati da solo: Compilatore Dart online