Menu
Coddy logo textTech

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 points

Questo 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.

challenge icon

Sfida

Facile

Crea 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:

  1. Leggere una stringa in input che rappresenta il nome del ristorante
  2. Leggere più coppie di input che rappresentano le voci del menu e i relativi importi di vendita (l'input terminerà quando riceverai "sales_done")
  3. Creare una Map per memorizzare ogni voce del menu come chiave e il relativo importo di vendita come valore
  4. Usare il metodo forEach per scorrere i dati di vendita e calcolare il ricavo totale
  5. Usare nuovamente il metodo forEach per individuare la voce più venduta (l'importo di vendita più alto)
  6. 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 successfully

Se 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 successfully

Se 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 successfully

Il 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
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Dart online