Menu
Coddy logo textTech

Iterowanie po mapie

Część sekcji Logika i przepływ sterowania ścieżki Dart w Coddy. Lekcja 26 z 65.

Podczas pracy z kolekcjami Map często trzeba przetworzyć każdą parę klucz-wartość. Metoda forEach to przejrzysty sposób na iterowanie po wszystkich wpisach w mapie, który zapewnia dostęp zarówno do klucza, jak i odpowiadającej mu wartości.

Metoda forEach przyjmuje funkcję jako argument. Ta funkcja otrzymuje dwa parametry: klucz i wartość dla każdego wpisu w mapie. Metoda automatycznie wywołuje Twoją funkcję raz dla każdej pary klucz-wartość w mapie.

Map<String, int> studentScores = {
  'Alice': 85,
  'Bob': 92,
  'Charlie': 78
};

studentScores.forEach((name, score) {
  print('$name scored $score points');
});
// Wynik:
// Alice scored 85 points
// Bob scored 92 points
// Charlie scored 78 points

To podejście jest znacznie wygodniejsze niż ręczne uzyskiwanie dostępu do każdego klucza lub próby przechodzenia przez mapę za pomocą innych metod. Metoda forEach obsługuje za Ciebie całą logikę iteracji, dzięki czemu Twój kod jest bardziej przejrzysty i czytelny, gdy musisz przetworzyć każdy wpis w mapie.

challenge icon

Wyzwanie

Łatwy

Utwórz program, który zarządza systemem raportowania dziennej sprzedaży restauracji, analizując pozycje z menu i dane dotyczące ich sprzedaży. Twój program powinien:

  1. Odczytać dane wejściowe w postaci ciągu znaków reprezentującego nazwę restauracji
  2. Odczytywać wiele par danych wejściowych reprezentujących pozycje z menu i kwoty ich sprzedaży (dane wejściowe będą się kończyć po otrzymaniu "sales_done")
  3. Utworzyć Mapę, w której każda pozycja z menu będzie kluczem, a kwota jej sprzedaży — wartością
  4. Użyć metody forEach, aby przejść przez dane dotyczące sprzedaży i obliczyć łączny przychód
  5. Ponownie użyć metody forEach, aby wskazać najlepiej sprzedającą się pozycję (o najwyższej kwocie sprzedaży)
  6. Wyświetlić raport sprzedaży w dokładnie takim formacie, jaki pokazano poniżej

Na przykład, jeśli nazwa restauracji to "Mario's Pizza", a dane dotyczące sprzedaży obejmują pozycję "Margherita Pizza" z kwotą 450, pozycję "Caesar Salad" z kwotą 280, pozycję "Garlic Bread" z kwotą 320 oraz pozycję "Tiramisu" z kwotą 180, program powinien wyświetlić:

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

Jeśli nazwa restauracji to "Sushi Express", a dane dotyczące sprzedaży obejmują pozycję "California Roll" z kwotą 380, pozycję "Salmon Sashimi" z kwotą 520 oraz pozycję "Miso Soup" z kwotą 150, program powinien wyświetlić:

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

Jeśli nazwa restauracji to "Burger Palace", a dane dotyczące sprzedaży obejmują pozycję "Classic Burger" z kwotą 600, pozycję "French Fries" z kwotą 400, pozycję "Milkshake" z kwotą 250 oraz pozycję "Onion Rings" z kwotą 180, program powinien wyświetlić:

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

Twój program musi używać metody forEach, aby przechodzić przez wpisy Mapy. Najpierw użyj forEach, aby wyświetlić każdą pozycję z menu i jej kwotę sprzedaży, jednocześnie obliczając łączny przychód. Następnie ponownie użyj forEach, aby znaleźć pozycję o najwyższej kwocie sprzedaży. Format danych wejściowych będzie następujący: nazwa restauracji, a następnie naprzemiennie nazwy pozycji z menu i kwoty ich sprzedaży (jako ciągi znaków, które należy przekonwertować na liczby całkowite), aż do "sales_done".

Spróbuj swoich sił

import 'dart:io';

void main() {
  // Wczytaj nazwę restauracji
  String? restaurantName = stdin.readLineSync();
  
  // Utwórz Map, aby przechowywać pozycje menu i odpowiadające im kwoty sprzedaży
  Map<String, int> salesData = {};
  
  // Wczytuj pozycje menu i kwoty sprzedaży aż do "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: Napisz swój kod poniżej
  // Użyj forEach, aby obliczyć łączny przychód i wyświetlić dane sprzedaży
  // Użyj ponownie forEach, aby znaleźć najlepiej sprzedającą się pozycję
  
  // Wyświetl raport sprzedaży w wymaganym formacie
  print("Restaurant: $restaurantName");
  print("Daily Sales Report:");
  // Wyświetl każdą pozycję i oblicz sumę
  // Znajdź i wyświetl najlepiej sprzedającą się pozycję
  // Wyświetl łączny przychód i status
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Dart online