Wochen vergleichen
Teil des Abschnitts Logik & Kontrollfluss der Swift-Journey von Coddy — Lektion 37 von 56.
Letztes Feature: Nimm Daten aus zwei Wochen und berichte die Änderung pro Gewohnheit.
Jede Woche ist eine eigene Liste von habit:day-Operationen in einer eigenen Zeile. Erstelle zwei Dictionaries auf die gleiche Weise wie bisher und vergleiche sie dann.
Die interessante Menge an Gewohnheiten ist die Vereinigung der Schlüssel über beide Wochen hinweg (eine Gewohnheit könnte in einer Woche erscheinen, aber nicht in der anderen). Iterieren Sie über diese alphabetisch sortierte Vereinigung.
let allKeys = Set(weekA.keys).union(weekB.keys).sorted()
for name in allKeys {
let a = weekA[name]?.count ?? 0
let b = weekB[name]?.count ?? 0
print("\(name): \(a) -> \(b)")
}Das ?? 0 behandelt den Fall eines fehlenden Schlüssels. Das weekA[name]?.count ist die optional-verkettete Methode, um einen Zähler zu lesen, ohne ihn vorher zu entpacken; es gibt nil zurück, wenn der Schlüssel nicht vorhanden ist, was das ?? 0 in Null umwandelt.
Aufgabe
MittelLies zwei Eingabezeilen ein, die jeweils eine kommagetrennte Liste von habit:day Einträgen enthalten (einer pro Woche). Für jede Gewohnheit, die in einer der beiden Wochen vorkommt, gib eine Zeile in diesem Format aus:
<habit>: <a> -> <b> <arrow>wobei a die Anzahl der eindeutigen Tage in Woche 1 ist, b die Anzahl der eindeutigen Tage in Woche 2 ist und arrow folgendes ist:
UPwennb > aDOWNwennb < aSAMEwennb == a
Gib die Gewohnheiten in alphabetischer Reihenfolge aus. Gib nach den zeilenweisen Angaben für jede Gewohnheit eine Zusammenfassungszeile aus:
Improved: <n>wobei n die Anzahl der Gewohnheiten mit dem Pfeil UP ist.
Für die Eingabe read:1,read:3,workout:2 in Zeile 1 und read:1,read:2,read:5,yoga:7 in Zeile 2 lautet die Ausgabe:
read: 2 -> 3 UP
workout: 1 -> 0 DOWN
yoga: 0 -> 1 UP
Improved: 2Spickzettel
Um die Vereinigung der Schlüssel aus zwei Dictionaries zu erhalten und alphabetisch zu iterieren:
let allKeys = Set(weekA.keys).union(weekB.keys).sorted()
for name in allKeys {
let a = weekA[name]?.count ?? 0
let b = weekB[name]?.count ?? 0
print("\(name): \(a) -> \(b)")
}weekA[name]?.count verwendet Optional Chaining, um die Anzahl ohne Unwrapping zu erhalten; es gibt nil zurück, wenn der Schlüssel fehlt. ?? 0 konvertiert dieses nil in Null.
Probier es selbst
func parse(_ line: String) -> [String: [Int]] {
var habits: [String: [Int]] = [:]
if line.isEmpty { return habits }
for op in line.components(separatedBy: ",") {
let parts = op.components(separatedBy: ":")
let day = Int(parts[1])!
if !(habits[parts[0], default: []].contains(day)) {
habits[parts[0], default: []].append(day)
}
}
return habits
}
let weekA = parse(readLine()!)
let weekB = parse(readLine()!)
// TODO: Vereinigung der Schlüssel; pro Gewohnheit '<name>: a -> b ARROW'; dann 'Improved: <n>'
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Kontrollfluss
1Strings im Detail
Zählen und IndizesGroß-/Kleinschreibung und TrimmenSuchen in StringsTeilen und ZusammenfügenTeilstrings ersetzenWiederholung – Benutzernamen-Check4Mengen
Mengen erstellenVereinigung und SchnittmengeDifferenz und symmetrische DifferenzTeilmenge und ObermengeRückblick – Tag-Filter7Projekt - Habit Tracker
ProjektübersichtAls erledigt markieren2Bereiche & Schrittweiten
Geschlossen vs. halboffenSchrittweiteRange-MethodenRanges in SwitchRückblick – Kalender-Grid5Funktionen höherer Ordnung Teil 1
MapFilterReduceVerkettung von map, filter, reduceRückblick – Wortstatistiken