Menu
Coddy logo textTech

Карты структур

Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 26 из 68.

Карты становятся невероятно мощными, когда вы храните структуры в качестве значений. Этот шаблон позволяет организовывать сложные структурированные данные, используя осмысленные ключи для удобного поиска и извлечения.

Когда вы используете структуры в качестве значений карты (map), вы, по сути, создаете коллекцию, где каждый ключ указывает на полную запись данных. Вот как можно объявить и инициализировать такую карту:

type Student struct {
    ID    int
    Grade string
}

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

Вы можете получать доступ к данным структур и работать с ними через карту точно так же, как и при любой другой операции с картой. Чтобы получить информацию о студенте, вы просто используете его имя в качестве ключа:

alice := students["Alice"]
fmt.Println(alice.ID)    // выводит: 101
fmt.Println(alice.Grade) // выводит: A

Этот паттерн чрезвычайно распространен в приложениях на Go для хранения коллекций связанных данных, таких как профили пользователей, каталоги товаров или настройки конфигурации, где требуются как структурированные данные, так и быстрый доступ по ключу.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

challenge icon

Задание

Легко

Создайте систему управления оценками студентов, используя карты (maps) со структурами в качестве значений. Эта задача демонстрирует, как организовать сложные данные о студентах, используя осмысленные ключи для эффективного поиска и извлечения.

Вы получите два входных значения:

  • Строка, представляющая количество студентов (например, "4")
  • Строка, содержащая данные о студентах в формате: "name1:id1:grade1,name2:id2:grade2,name3:id3:grade3" (например, "Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A")

Ваша задача:

  1. Определить структуру Student со следующими полями:
    • ID (int) — идентификационный номер студента
    • Grade (string) — буквенная оценка студента
  2. Создать карту (map), где ключами являются имена студентов (строки), а значениями — структуры Student
  3. Разобрать данные о студентах из второго входного значения:
    • Разделить входную строку по запятым, чтобы получить записи об отдельных студентах
    • Для каждой записи разделить ее по двоеточиям, чтобы отделить имя, ID и оценку
    • Преобразовать строку ID в целое число
    • Создать структуру Student и добавить ее в карту, используя имя в качестве ключа
  4. Вывести всех студентов в алфавитном порядке по имени в формате: "[name]: ID [id], Grade [grade]"
  5. Рассчитать и вывести статистику по оценкам:
    • Подсчитать, сколько студентов имеют каждую оценку (A, B, C, D, F)
    • Вывести количество для каждой встретившейся оценки в формате: "Grade [grade]: [count] students"
    • Выводить оценки в алфавитном порядке (A, B, C, D, F)
  6. Найти и вывести студента с самым высоким ID в формате: "Highest ID: [name] ([id])"
  7. Вывести общее количество студентов: "Total students: [count]"

Используйте пакет strconv для преобразования строки ID в целое число и пакет sort для сортировки имен студентов по алфавиту. Эта задача демонстрирует, как карты со значениями-структурами обеспечивают эффективный способ организации и доступа к сложным коллекциям данных с использованием осмысленных идентификаторов.

Шпаргалка

Карты могут хранить структуры в качестве значений, создавая коллекции, где каждый ключ указывает на полную запись данных:

type Student struct {
    ID    int
    Grade string
}

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

Доступ к данным структуры через карту осуществляется с помощью ключа:

alice := students["Alice"]
fmt.Println(alice.ID)    // выводит: 101
fmt.Println(alice.Grade) // выводит: A

Этот паттерн обычно используется для хранения коллекций связанных данных, таких как профили пользователей, каталоги товаров или настройки конфигурации, когда вам требуются как структурированные данные, так и быстрый доступ по ключу.

Попробуйте сами

package main

import (
	"fmt"
)

func main() {
	// Чтение входных данных
	var numStudentsStr string
	var studentData string
	fmt.Scanln(&numStudentsStr)
	fmt.Scanln(&studentData)
	
	// TODO: Определите структуру Student здесь
	
	// TODO: Создайте карту (map) для хранения студентов (имя как ключ, структура Student как значение)
	
	// TODO: Разберите данные о студентах и заполните карту
	
	// TODO: Выведите всех студентов в алфавитном порядке по имени
	
	// TODO: Рассчитайте и выведите статистику оценок
	
	// TODO: Найдите и выведите студента с самым высоким ID
	
	// TODO: Выведите общее количество студентов
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком