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 pointsTo 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.
Wyzwanie
ŁatwyUtwó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:
- Odczytać dane wejściowe w postaci ciągu znaków reprezentującego nazwę restauracji
- 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") - Utworzyć Mapę, w której każda pozycja z menu będzie kluczem, a kwota jej sprzedaży — wartością
- Użyć metody
forEach, aby przejść przez dane dotyczące sprzedaży i obliczyć łączny przychód - Ponownie użyć metody
forEach, aby wskazać najlepiej sprzedającą się pozycję (o najwyższej kwocie sprzedaży) - 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 successfullyJeś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 successfullyJeś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 successfullyTwó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
}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
1Zaawansowana manipulacja listami
Właściwości listy: first i lastStan listy: isEmpty i isNotEmpOdwracanie listyDodawanie do listy: insertUsuwanie z listy: removeWhereWyszukiwanie na liście: indexOfSortowanie listyMieszanie elementów listyPodsumowanie – Organizator listy4Zaawansowane operacje na mapach
Iterowanie po mapieSprawdzanie kluczy i wartościWłaściwości mapy: klucze i wartościDodawanie warunkowe: putIfAbsentUsuwanie wpisów z mapyZagnieżdżone mapyPodsumowanie – aktualizacja stanu magazynowego2Operacje funkcyjne na listach
Przekształcanie za pomocą 'map'Filtrowanie za pomocą 'where'Używanie '.toList()'Sprawdzanie warunków za pomocą 'any'Warunki z użyciem 'every'Wyszukiwanie za pomocą 'firstWhere'Podsumowanie — filtrowanie danych5Projekt: Kalkulator koszyka zakupowego
Konfiguracja projektuDodawanie produktów do koszyka3Zbiory
Czym jest zbiór?Tworzenie zbioruDodawanie i usuwanie elementów ze zbiorówSprawdzanie, czy element znajduje się w zbiorzeKonwersja listy na zbiórSuma zbiorówCzęść wspólna zbiorówRóżnica zbiorówPodsumowanie — unikalna lista gościPoćwicz samodzielnie: Kompilator Dart online