🎯 Kotlin

Zweidimensionale Arrays in Kotlin 1.9: Eine ausführliche Anleitung

Что такое двумерные массивы?

Представь себе шахматную доску. У неё есть строки (горизонтальные линии) и столбцы (вертикальные линии). Каждая клетка находится на пересечении строки и столбца. Двумерный массив — это точно такая же таблица, только с числами, буквами или другими данными.

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

Как объявить двумерный массив в Kotlin?

Самый простой способ — использовать вложенные массивы. Вот несколько вариантов:

// Пустой массив 3x3 (3 строки, 3 столбца), заполненный нулями
val matrix = Array(3) { Array(3) { 0 } }

// Массив с готовыми значениями 2x2
val numbers = arrayOf(
    arrayOf(1, 2),
    arrayOf(3, 4)
)

Обрати внимание: первый индекс — это номер строки (ряд), второй — номер столбца (место). Отсчёт начинается с нуля!

Обращение к элементам и их изменение

fun main() {
    val cinema = Array(3) { Array(4) { 0 } } // 3 ряда, 4 места

    // Ставим зрителя на 1-й ряд (индекс 0), 2-е место (индекс 1)
    cinema[0][1] = 1

    // Печатаем значение
    println("На 1-м ряду, 2-м месте сидит: ${cinema[0][1]}")
}

Ввод данных с клавиатуры (readln)

Чаще всего массив заполняется пользователем. Вот как это делается:

fun main() {
    println("Введите количество рядов:")
    val rows = readln().toInt()
    println("Введите количество мест в ряду:")
    val cols = readln().toInt()

    // Создаём пустой массив
    val hall = Array(rows) { Array(cols) { 0 } }

    // Заполняем построчно
    for (i in 0 until rows) {
        println("Введите $cols чисел для ряда ${i + 1} через пробел:")
        val line = readln().split(" ").map { it.toInt() }
        for (j in 0 until cols) {
            hall[i][j] = line[j]
        }
    }

    // Выводим схему зала
    println("Схема зала:")
    for (i in 0 until rows) {
        for (j in 0 until cols) {
            print("${hall[i][j]} ")
        }
        println() // переход на новую строку
    }
}

Разбор типичных задач

Задача «Кинозал "Уют"»

Нужно создать схему зала. Пользователь вводит размеры, а затем программа выводит таблицу с нулями (свободные места).

fun main() {
    println("Введите количество рядов:")
    val rows = readln().toInt()
    println("Введите количество мест:")
    val cols = readln().toInt()

    val hall = Array(rows) { Array(cols) { 0 } }

    println("Схема зала:")
    for (i in 0 until rows) {
        for (j in 0 until cols) {
            print("${hall[i][j]} ")
        }
        println()
    }
}

Задача «Данные землетрясений»

Создаём массив 2x2 и заполняем его значениями магнитуды.

fun main() {
    println("Введите магнитуды для 4 землетрясений (2 строки по 2 числа):")
    val data = Array(2) { Array(2) { 0.0 } }

    for (i in 0 until 2) {
        val line = readln().split(" ").map { it.toDouble() }
        for (j in 0 until 2) {
            data[i][j] = line[j]
        }
    }

    println("Массив землетрясений:")
    for (row in data) {
        for (value in row) {
            print("$value ")
        }
        println()
    }
}

Задача «Популярность постов»

Вводим количество блогеров и постов, затем заполняем таблицу лайков.

fun main() {
    println("Введите количество блогеров:")
    val bloggers = readln().toInt()
    println("Введите количество постов:")
    val posts = readln().toInt()

    val likes = Array(bloggers) { Array(posts) { 0 } }

    for (i in 0 until bloggers) {
        println("Введите лайки для блогера ${i + 1} через пробел:")
        val line = readln().split(" ").map { it.toInt() }
        for (j in 0 until posts) {
            likes[i][j] = line[j]
        }
    }

    println("Таблица лайков:")
    for (row in likes) {
        println(row.joinToString(" "))
    }
}

Частые ошибки новичков

  • Выход за границы массива: если массив размером 3x3, то индексы идут от 0 до 2. Обращение к индексу 3 вызовет ошибку. Всегда проверяй циклы: for (i in 0 until rows).
  • Путаница строк и столбцов: первый индекс — строка, второй — столбец. Если перепутать, программа может работать неправильно.
  • Забыли преобразовать строку в число: readln() возвращает строку. Чтобы получить число, нужно написать .toInt() или .toDouble().
  • Неправильное создание массива: Array(3) { Array(3) { 0 } } — правильный синтаксис. Если написать Array(3, Array(3, {0})), будет ошибка.

Итоговый пример: «Карта острова Капитана Сильвера»

У нас есть карта 4x4. Нужно найти координаты сокровища (символ 'X').

fun main() {
    val map = arrayOf(
        arrayOf('.', '.', '.', '.'),
        arrayOf('.', 'X', '.', '.'),
        arrayOf('.', '.', '.', '.'),
        arrayOf('.', '.', '.', '.')
    )

    var found = false
    for (i in map.indices) {
        for (j in map[i].indices) {
            if (map[i][j] == 'X') {
                println("Сокровище найдено! Строка: ${i + 1}, Столбец: ${j + 1}")
                found = true
            }
        }
    }

    if (!found) {
        println("Сокровище не найдено.")
    }
}

Теперь ты знаешь, как работать с двумерными массивами в Kotlin. Это мощный инструмент для решения задач с таблицами, картами и любыми данными, которые можно представить в виде сетки. Практикуйся, и всё получится!