Menu
CoddyTech

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

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

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

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

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 для хранения наборов связанных данных, таких как профили пользователей, каталоги товаров или параметры конфигурации, когда нужны и структурированные данные, и быстрый доступ по ключу.

challenge icon

Задание

Легко

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

Тебе будут предоставлены два входных значения:

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

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

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

package main

import (
	"fmt"
)

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

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Go