Menu
CoddyTech

Map chứa struct

Thuộc phần Logic và luồng điều khiển trong hành trình GO của Coddy. Bài học 26 trên 68.

Map trở nên vô cùng hữu ích khi bạn lưu struct làm giá trị. Cách này giúp bạn sắp xếp dữ liệu có cấu trúc phức tạp bằng các khóa có ý nghĩa, giúp tra cứu và truy xuất dễ dàng.

Khi dùng struct làm giá trị trong map, về cơ bản bạn đang tạo một tập hợp trong đó mỗi khóa trỏ đến một bản ghi dữ liệu hoàn chỉnh. Sau đây là cách khai báo và khởi tạo map như vậy:

type Student struct {
    ID    int
    Grade string
}

students := map[string]Student{
    "Alice": {ID: 101, Grade: "A"},
    "Bob":   {ID: 102, Grade: "B"},
}

Bạn có thể truy cập và thao tác với dữ liệu struct thông qua map giống như với bất kỳ thao tác map nào khác. Để lấy thông tin của một học sinh, bạn chỉ cần dùng tên của bạn ấy làm khóa:

alice := students["Alice"]
fmt.Println(alice.ID)    // in ra: 101
fmt.Println(alice.Grade) // in ra: A

Mẫu này rất phổ biến trong các ứng dụng Go để lưu trữ tập hợp dữ liệu có liên quan, chẳng hạn như hồ sơ người dùng, danh mục sản phẩm hoặc cài đặt cấu hình, khi bạn cần cả dữ liệu có cấu trúc lẫn khả năng truy cập nhanh dựa trên khóa.

challenge icon

Thử thách

Dễ

Tạo hệ thống quản lý điểm của học sinh bằng map với struct làm giá trị. Thử thách này hướng dẫn cách sắp xếp dữ liệu học sinh phức tạp bằng các khóa có ý nghĩa để tra cứu và truy xuất hiệu quả.

Bạn sẽ nhận được hai đầu vào:

  • Một chuỗi biểu thị số lượng học sinh (ví dụ: "4")
  • Một chuỗi chứa dữ liệu học sinh theo định dạng: "name1:id1:grade1,name2:id2:grade2,name3:id3:grade3" (ví dụ: "Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A")

Nhiệm vụ của bạn là:

  1. Định nghĩa struct Student với các trường sau:
    • ID (int), mã số của học sinh
    • Grade (string), xếp loại chữ của học sinh
  2. Tạo map trong đó khóa là tên học sinh (chuỗi) và giá trị là các struct Student
  3. Phân tích dữ liệu học sinh từ đầu vào thứ hai:
    • Tách đầu vào theo dấu phẩy để lấy từng mục dữ liệu học sinh
    • Với mỗi mục, tách theo dấu hai chấm để phân biệt tên, mã số và xếp loại
    • Chuyển chuỗi mã số thành số nguyên
    • Tạo struct Student và thêm vào map với tên làm khóa
  4. Hiển thị tất cả học sinh theo thứ tự bảng chữ cái của tên, theo định dạng: "[name]: ID [id], Grade [grade]"
  5. Tính toán và hiển thị thống kê xếp loại:
    • Đếm số học sinh đạt từng xếp loại (A, B, C, D, F)
    • Hiển thị số lượng của mỗi xếp loại xuất hiện theo định dạng: "Grade [grade]: [count] students"
    • Hiển thị các xếp loại theo thứ tự bảng chữ cái (A, B, C, D, F)
  6. Tìm và hiển thị học sinh có mã số cao nhất theo định dạng: "Highest ID: [name] ([id])"
  7. Hiển thị tổng số học sinh: "Total students: [count]"

Dùng package strconv để chuyển chuỗi mã số thành số nguyên và package sort để sắp xếp tên học sinh theo thứ tự bảng chữ cái. Thử thách này hướng dẫn cách map với các giá trị struct giúp sắp xếp và truy cập hiệu quả những tập hợp dữ liệu phức tạp bằng các mã định danh có ý nghĩa.

Tự làm thử

package main

import (
	"fmt"
)

func main() {
	// Đọc đầu vào
	var numStudentsStr string
	var studentData string
	fmt.Scanln(&numStudentsStr)
	fmt.Scanln(&studentData)
	
	// TODO: Định nghĩa struct Student ở đây
	
	// TODO: Tạo map để lưu sinh viên (tên làm khóa, struct Student làm giá trị)
	
	// TODO: Phân tích dữ liệu sinh viên và đưa vào map
	
	// TODO: Hiển thị tất cả sinh viên theo thứ tự bảng chữ cái của tên
	
	// TODO: Tính và hiển thị thống kê điểm
	
	// TODO: Tìm và hiển thị sinh viên có ID lớn nhất
	
	// TODO: Hiển thị tổng số sinh viên
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng điều khiển

Tự luyện tập: Trình biên dịch Go online