Suchen mit 'firstWhere'
Teil des Abschnitts Logik & Ablauf der Dart-Journey von Coddy — Lektion 15 von 65.
Wenn Sie ein bestimmtes Element in einer Liste finden müssen, das bestimmte Kriterien erfüllt, bietet die Methode firstWhere() eine effiziente Lösung. Im Gegensatz zu Filter-Methoden, die alle übereinstimmenden Elemente zurückgeben, stoppt firstWhere() die Suche, sobald das erste Element gefunden wird, das Ihre Bedingung erfüllt.
Die Methode firstWhere() nimmt eine Testfunktion entgegen, die für jedes Element true oder false zurückgibt. Sie prüft die Elemente nacheinander, bis sie das erste findet, das den Test besteht, und gibt dieses Element dann sofort zurück.
List<int> numbers = [1, 3, 8, 15, 22, 7];
// Finde die erste gerade Zahl
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven); // 8Für Situationen, in denen kein Element Ihrer Bedingung entspricht, bietet firstWhere() einen optionalen orElse-Parameter. Dieser Parameter akzeptiert eine Funktion, die einen Standardwert zurückgibt, wenn keine Übereinstimmung gefunden wird, wodurch verhindert wird, dass Ihr Programm mit einem Fehler abstürzt.
Aufgabe
EinfachErstellen Sie ein Programm, das ein Kundenservice-System verwaltet, indem es die erste Kundenbeschwerde findet, die sofortige Aufmerksamkeit erfordert. Ihr Programm sollte:
- Einen String-Input einlesen, der den Abteilungsnamen darstellt
- Mehrere Integer-Inputs einlesen, die die Prioritätsstufen der Beschwerden darstellen (die Eingabe endet, wenn Sie
-1erhalten) - Einen Integer-Input einlesen, der den Schwellenwert für dringende Priorität darstellt
- Die Methode
firstWhere()verwenden, um die erste Beschwerde mit einer Prioritätsstufe größer oder gleich dem dringenden Schwellenwert zu finden - Die Kundenservice-Ergebnisse im exakt unten gezeigten Format ausgeben
Wenn zum Beispiel der Abteilungsname "Technical Support" ist, die Prioritätsstufen 3, 7, 2, 9, 4 sind und der dringende Schwellenwert 8 ist, sollte Ihr Programm Folgendes ausgeben:
Department: Technical Support
All complaints: [3, 7, 2, 9, 4]
Urgent threshold: 8
Searching for first complaint >= 8
First urgent complaint: 9
Status: Urgent complaint found - immediate action requiredWenn der Abteilungsname "Billing Department" ist, die Prioritätsstufen 4, 6, 3, 5 sind und der dringende Schwellenwert 7 ist, sollte Ihr Programm Folgendes ausgeben:
Department: Billing Department
All complaints: [4, 6, 3, 5]
Urgent threshold: 7
Searching for first complaint >= 7
First urgent complaint: Not found
Status: No urgent complaints - continue normal processingWenn der Abteilungsname "Sales Support" ist, die Prioritätsstufen 10, 2, 8 sind und der dringende Schwellenwert 9 ist, sollte Ihr Programm Folgendes ausgeben:
Department: Sales Support
All complaints: [10, 2, 8]
Urgent threshold: 9
Searching for first complaint >= 9
First urgent complaint: 10
Status: Urgent complaint found - immediate action requiredIhr Programm muss die Methode firstWhere() verwenden, um die erste Beschwerdepriorität zu finden, die größer oder gleich dem dringenden Schwellenwert ist. Wenn keine dringende Beschwerde gefunden wird, zeigen Sie "Not found" für die erste dringende Beschwerde an und geben Sie "No urgent complaints - continue normal processing" als Status aus. Wenn eine dringende Beschwerde gefunden wird, zeigen Sie die Prioritätsstufe an und geben Sie "Urgent complaint found - immediate action required" als Status aus.
Spickzettel
Die Methode firstWhere() findet das erste Element in einer Liste, das eine bestimmte Bedingung erfüllt. Sie bricht die Suche ab, sobald eine Übereinstimmung gefunden wird, und gibt dieses Element zurück.
List<int> numbers = [1, 3, 8, 15, 22, 7];
// Finde die erste gerade Zahl
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven); // 8Verwenden Sie den Parameter orElse, um einen Standardwert bereitzustellen, wenn kein Element die Bedingung erfüllt:
// Gibt einen Standardwert zurück, wenn keine Übereinstimmung gefunden wird
int result = numbers.firstWhere(
(number) => number > 100,
orElse: () => -1
);Probier es selbst
import 'dart:io';
void main() {
// Abteilungsnamen lesen
String? department = stdin.readLineSync();
// Beschwerde-Prioritätsstufen lesen bis -1
List<int> complaints = [];
while (true) {
int priority = int.parse(stdin.readLineSync()!);
if (priority == -1) break;
complaints.add(priority);
}
// Dringlichkeitsschwellenwert lesen
int urgentThreshold = int.parse(stdin.readLineSync()!);
// TODO: Schreiben Sie Ihren Code unten
// Verwenden Sie die Methode firstWhere(), um die erste Beschwerde >= urgentThreshold zu finden
// Ergebnisse ausgeben
print('Department: $department');
print('All complaints: $complaints');
print('Urgent threshold: $urgentThreshold');
print('Searching for first complaint >= $urgentThreshold');
// Ergebnis der ersten dringenden Beschwerde drucken
// Statusmeldung drucken
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Fortgeschrittene Listenmanipulation
Listen-Eigenschaften: first & lastListen-Status: isEmpty & isNotEmptyEine Liste umkehrenHinzufügen zu einer Liste: insertElemente aus Liste entfernen: removeWhereSuchen in einer Liste: indexOfEine Liste sortierenEine Liste mischenZusammenfassung – Listen-Organizer4Fortgeschrittene Map-Manipulation
Über eine Map iterierenPrüfen auf Schlüssel und WerteMap-Eigenschaften: keys & valuesBedingtes Hinzufügen: putIfAbsentEinträge aus einer Map entfernenVerschachtelte MapsRückblick – Inventar-Update7Fortgeschrittene Funktionen
Anonyme FunktionenFunktionen als Argumente übergebenClosures verstehenEinführung in die RekursionRekursive Funktion: CountdownRekursive Funktion: FakultätZusammenfassung – List Processor10Abschluss-Herausforderungen
Herausforderung: NotensortiererHerausforderung: VokalzählerHerausforderung: FizzBuzz2Funktionale Listenoperationen
Transformieren mit 'map'Filtern mit 'where''.toList()' verwendenBedingungen prüfen mit 'any'Bedingungen mit 'every'Suchen mit 'firstWhere'Zusammenfassung – Datenfilterung3Sets
Was ist ein Set?Ein Set erstellenHinzufügen und Entfernen in SetsPrüfen auf Elemente in einem SetEine Liste in ein Set umwandelnSet-VereinigungSet-SchnittmengeSet-DifferenzRückblick – Einzigartige Gästeliste