Ôn tập: Các thao tác với HashMap
Thuộc phần Logic và luồng chương trình trong hành trình C# của Coddy. Bài học 55 trên 66.
Thử thách
Trung bìnhTạo một phương thức tên là ProcessDictionary để thực hiện các thao tác nâng cao trên từ điển<string, int> lưu kho. Phương thức này cần:
- Xử lý các lệnh từ danh sách thao tác:
COUNT: In raTotal items: {count}(trong đó{count}là số khóa riêng biệt), sau đó in thông báo thành côngADD item quantity: Thêm mặt hàng mới với số lượng đã chỉ định (nếu mặt hàng đã tồn tại, tăng số lượng của mặt hàng đó), sau đó in thông báo thành côngREMOVE item: Xóa mặt hàng đã chỉ định khỏi kho, sau đó in thông báo thành công hoặc thất bạiUPDATE item quantity: Đặt số lượng của mặt hàng thành giá trị đã chỉ định, sau đó in thông báo thành công hoặc thất bạiFIND item: Nếu tìm thấy, in ra{item}: {quantity}, sau đó in thông báo thành công; nếu không tìm thấy, in raNot found, sau đó in thông báo thất bại
- Với mỗi thao tác, in thông báo trạng thái theo đúng định dạng sau:
Operation {command} performed successfullyOperation {command} failed: {reason}. Trong đó,{reason}làItem not foundkhi mặt hàng không tồn tại trong kho
- Trả về từ điển kho đã cập nhật
Ví dụ, xử lý
FIND orange trên kho có orange: 3 sẽ in ra:orange: 3Operation FIND performed successfullyVà xử lý
REMOVE shoes khi shoes không có trong kho sẽ in ra:Operation REMOVE failed: Item not foundTự làm thử
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
class Program
{
public static Dictionary<string, int> ProcessDictionary(Dictionary<string, int> inventory, List<string> operations)
{
// Viết code của bạn ở đây
return inventory;
}
static void Main(string[] args)
{
Dictionary<string, int> inventory = new Dictionary<string, int>();
List<string> operations = new List<string>();
// Đọc dòng đầu tiên để kiểm tra inventory có ở định dạng JSON không
string firstLine = Console.ReadLine();
// Kiểm tra đầu vào của inventory có ở định dạng JSON không
if (firstLine != null && firstLine.StartsWith("{") && firstLine.EndsWith("}"))
{
try
{
// Xử lý đầu vào JSON cho inventory
string jsonContent = firstLine.Substring(1, firstLine.Length - 2);
// Tách theo dấu phẩy nằm ngoài dấu ngoặc kép
string pattern = @",(?=(?:[^""]*""[^""]*"")*[^""]*$)";
string[] entries = Regex.Split(jsonContent, pattern);
foreach (string entry in entries)
{
// Dùng regex để trích xuất khóa và giá trị
Match match = Regex.Match(entry, @"""([^""]+)""\s*:\s*(\d+)");
if (match.Success)
{
string keyMatch = match.Groups[1].Value;
int valueMatch = int.Parse(match.Groups[2].Value);
inventory.Add(keyMatch, valueMatch);
}
}
// Read second line for operations
string secondLine = Console.ReadLine();
// Check if operations are in JSON array format
if (secondLine != null && secondLine.StartsWith("[") && secondLine.EndsWith("]"))
{
try
{
// Extract content between square brackets
string arrayContent = secondLine.Substring(1, secondLine.Length - 2);
// Use regex to match all quoted strings - this is more robust
MatchCollection matches = Regex.Matches(arrayContent, @"""([^""]*)""");
foreach (Match match in matches)
{
// Add the captured group (without quotes)
if (match.Groups.Count > 1)
{
operations.Add(match.Groups[1].Value);
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Error parsing operations array: {ex.Message}");
return;
}
}
else
{
// Process operations in traditional format
int m = int.Parse(secondLine);
for (int i = 0; i < m; i++)
{
operations.Add(Console.ReadLine());
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Error parsing JSON input: {ex.Message}");
return;
}
}
else
{
// Process traditional input format
int n = int.Parse(firstLine);
for (int i = 0; i < n; i++)
{
string[] parts = Console.ReadLine().Split(':');
inventory.Add(parts[0], int.Parse(parts[1]));
}
// Read operations
int m = int.Parse(Console.ReadLine());
for (int i = 0; i < m; i++)
{
operations.Add(Console.ReadLine());
}
}
Dictionary<string, int> result = ProcessDictionary(inventory, operations);
// Print updated inventory
Console.WriteLine("Final Inventory:");
foreach (var item in result)
{
Console.WriteLine($"{item.Key}: {item.Value}");
}
}
}Tất cả bài học trong Logic và luồng chương trình
1Mảng nhiều chiều
Cơ bản về mảng 2 chiềuKhai báo và khởi tạo mảng 2 chiềuTruy cập phần tử mảng 2 chiềuVòng lặp lồng nhau với mảng 2 chiềuMảng răng cưaCác phép toán ma trận thường gặpÔn tập: mảng nhiều chiều4Kỹ thuật điều khiển luồng
Lệnh trả về sớmMệnh đề bảo vệCâu lệnh nhảy (goto)Break và continueLàm phẳng các câu lệnh điều kiện lồng nhau7Toán tử logic nâng cao
Đánh giá ngắn mạchToán tử logic có điều kiệnĐộ ưu tiên của toán tửÔn tập: toán tử nâng cao10HashMap phần 2
Các phương thức của HashMapHashMap lồng nhauÔn tập: Quản lý kho hàngÔn tập: Các thao tác với HashMap2Ra quyết định nâng cao
Nhiều điều kiệnLogic Boolean phức tạpSo sánh if và switchCâu lệnh switch lồng nhauÔn tập về ra quyết định nâng cao5Xử lý ngoại lệ
Cơ bản về try-catchCác loại ngoại lệNhiều khối catchLàm việc với tệpKhối finallyUsing hay try-finallyNgoại lệ tùy chỉnhÔn tập: xử lý lỗi8Hệ thống phân tích dữ liệu
Thiết lập thu thập dữ liệuLogic nhập dữ liệu3Cải tiến vòng lặp
Hiệu suất vòng lặpLặp qua dữ liệu phức tạpTừng kiểu vòng lặpTái cấu trúc vòng lặpÔn tập: vòng lặp tối ưu6Xử lý null
Cơ bản về tham chiếu nullKiểu giá trị có thể nullCác mẫu kiểm tra nullLập trình phòng vệÔn tập về an toàn với nullTự luyện tập: Trình biên dịch C# online