Verschachtelte HashMap
Teil des Abschnitts Logik & Ablauf der C#-Journey von Coddy. Lektion 53 von 66.
Eine verschachtelte HashMap ist eine HashMap, bei der die Werte selbst HashMaps sind. Dies ist nützlich, um hierarchische Daten zu organisieren.
Erstelle eine verschachtelte HashMap, um Schülernoten nach Fach zu speichern:
// Erstelle die äußere HashMap (Schüler -> Fächer)
Dictionary<string, Dictionary<string, int>> studentGrades = new Dictionary<string, Dictionary<string, int>>();
// Erstelle eine innere HashMap für einen Schüler (Fach -> Note)
Dictionary<string, int> alexGrades = new Dictionary<string, int>();
// Füge Noten zur inneren HashMap hinzu
alexGrades.Add("Math", 90);
alexGrades.Add("Science", 85);
// Füge die innere HashMap zur äußeren HashMap hinzu
studentGrades.Add("Alex", alexGrades);Zugriff auf einen verschachtelten Wert:
// Zugriff auf Alex' Mathe-Note
int mathGrade = studentGrades["Alex"]["Math"]; // Gibt 90 zurückFügen Sie einen weiteren Schüler mit ihren Noten hinzu:
// Eine weitere innere HashMap erstellen
Dictionary<string, int> sarahGrades = new Dictionary<string, int>();
sarahGrades.Add("Math", 95);
sarahGrades.Add("Science", 92);
// Zur äußeren HashMap hinzufügen
studentGrades.Add("Sarah", sarahGrades);Aufgabe
MittelErstelle eine Methode namens AddCourseGrade, die vier Argumente entgegennimmt:
- Ein verschachteltes Dictionary, das die Noten der Studierenden darstellt:
Dictionary<string, Dictionary<string, int>> grades - Einen Namen eines Studierenden (string)
- Einen Kursnamen (string)
- Eine Note (int)
Die Methode sollte:
- Wenn der Studierende im Dictionary nicht existiert, einen neuen Eintrag für ihn erstellen
- Den Kurs und die Note zum Datensatz des Studierenden hinzufügen
- Wenn der Kurs für diesen Studierenden bereits existiert, die Note aktualisieren
- Nach dem Hinzufügen/Aktualisieren "Added [course] grade for [student]: [grade]" ausgeben
Probier es selbst
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
class Program
{
public static void AddCourseGrade(Dictionary<string, Dictionary<string, int>> grades, string student, string course, int grade)
{
// Schreibe deinen Code hier
}
// Ignoriere den Hauptcode, er konvertiert einen String in eine HashMap
static void Main(string[] args)
{
// Prüfe, ob die erste Zeile JSON sein könnte
string firstLine = Console.ReadLine();
Dictionary<string, Dictionary<string, int>> studentGrades = new Dictionary<string, Dictionary<string, int>>();
string student;
string course;
int grade;
// Eingabe im JSON-Format
if (firstLine != null && firstLine.StartsWith("{") && firstLine.EndsWith("}"))
{
try
{
// Bestehende Schülernoten aus JSON parsen
string jsonContent = firstLine.Substring(1, firstLine.Length - 2);
string studentPattern = @"""([^""]+)""\s*:\s*\{([^\}]+)\}";
MatchCollection studentMatches = Regex.Matches(jsonContent, studentPattern);
foreach (Match studentMatch in studentMatches)
{
string studentName = studentMatch.Groups[1].Value;
string coursesJson = studentMatch.Groups[2].Value;
Dictionary<string, int> courseGrades = new Dictionary<string, int>();
string coursePattern = @"""([^""]+)""\s*:\s*(\d+)";
MatchCollection courseMatches = Regex.Matches(coursesJson, coursePattern);
foreach (Match courseMatch in courseMatches)
{
string courseName = courseMatch.Groups[1].Value;
int courseGrade = int.Parse(courseMatch.Groups[2].Value);
courseGrades.Add(courseName, courseGrade);
}
studentGrades.Add(studentName, courseGrades);
}
// Parse student, course, and grade for the operation
string studentInput = Console.ReadLine();
Match studentNameMatch = Regex.Match(studentInput, @"""([^""]+)""");
student = studentNameMatch.Success ? studentNameMatch.Groups[1].Value : studentInput;
string courseInput = Console.ReadLine();
Match courseNameMatch = Regex.Match(courseInput, @"""([^""]+)""");
course = courseNameMatch.Success ? courseNameMatch.Groups[1].Value : courseInput;
grade = int.Parse(Console.ReadLine());
}
catch (Exception ex)
{
Console.WriteLine($"Error parsing JSON input: {ex.Message}");
return;
}
}
else
{
try
{
// Traditional input
student = firstLine;
course = Console.ReadLine();
grade = int.Parse(Console.ReadLine());
// Create an example entry
Dictionary<string, int> johnGrades = new Dictionary<string, int>();
johnGrades.Add("Math", 88);
studentGrades.Add("John", johnGrades);
}
catch (Exception ex)
{
Console.WriteLine($"Error parsing traditional input: {ex.Message}");
return;
}
}
AddCourseGrade(studentGrades, student, course, grade);
}
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Mehrdimensionale Arrays
Grundlagen 2D-Arrays2D-Arrays deklarieren und initialisierenAuf Elemente von 2D-Arrays zugreifenVerschachtelte Schleifen mit 2D-ArraysGezackte ArraysHäufige MatrixoperationenZusammenfassung – Mehrdimensionale Arrays4Techniken zur Ablaufsteuerung
Frühe RückgabenWächterklauselnSprunganweisungen (goto)Break und ContinueVerschachtelte Bedingungen abflachen7Logische Operatoren – Fortgeschritten
KurzschlussauswertungBedingte logische OperatorenOperatorrangfolgeRückblick – Erweiterte Operatoren10HashMap Teil 2
HashMap-MethodenVerschachtelte HashMapWiederholung – Lager verwaltenWiederholung – HashMap-Operationen2Fortgeschrittene Entscheidungslogik
Mehrere BedingungenKomplexe boolesche LogikVergleich: If vs. SwitchVerschachtelte Switch-AnweisungenRückblick – Fortgeschrittene Entscheidungen5Fehlerbehandlung mit Exceptions
Grundlagen von Try-CatchException-TypenMehrere Catch-BlöckeArbeiten mit DateienFinally-BlockUsing im Vergleich zu Try-FinallyBenutzerdefinierte ExceptionsZusammenfassung – Fehlerbehandlung3Schleifenverbesserungen
SchleifenleistungKomplexe IterationJeder SchleifentypSchleifen refaktorierenRückblick – Optimierte Schleifen6Behandlung von Nullwerten
Grundlagen von NullreferenzenNullable WerttypenMuster zur NullprüfungDefensive ProgrammierungZusammenfassung – NullsicherheitÜbe selbstständig: Online-C#-Compiler