🎯 Kotlin

Массивы (списки) в Kotlin 1.9: подробное руководство

Массивы (списки) в Kotlin

Что такое массив (список) и зачем он нужен?

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

Массив — это набор элементов (чисел, строк, фруктов), которые хранятся вместе под одним именем. Каждый элемент имеет свой номер — индекс. Нумерация начинается с 0: первый элемент — индекс 0, второй — индекс 1 и так далее.

Зачем это нужно? Без массивов нам пришлось бы заводить отдельную переменную для каждого предмета: фрукт1, фрукт2, фрукт3… А если фруктов 100? Массив решает эту проблему: один список, много элементов.

Основной синтаксис

В Kotlin есть два основных типа списков: изменяемые (mutable) и неизменяемые (immutable). Для начинающих удобнее использовать изменяемые — их можно менять: добавлять, удалять, заменять элементы.

Создание списка

// Список строк (фрукты)
val fruits = mutableListOf("яблоко", "банан", "апельсин")

// Список чисел (высота в метрах)
val heights = mutableListOf(100, 250, 400, 150, 500)

// Пустой список (пока нет элементов)
val emptyList = mutableListOf<String>()

Доступ к элементам

val fruits = mutableListOf("яблоко", "банан", "апельсин")
println(fruits[0]) // яблоко
println(fruits[1]) // банан
println(fruits[2]) // апельсин

Изменение элемента

val fruits = mutableListOf("яблоко", "банан", "апельсин")
fruits[1] = "киви"  // заменили банан на киви
println(fruits)     // [яблоко, киви, апельсин]

Добавление и удаление

val fruits = mutableListOf("яблоко", "банан")
fruits.add("груша")       // добавить в конец
fruits.add(0, "вишня")    // добавить на позицию 0
fruits.remove("банан")    // удалить элемент "банан"
println(fruits)           // [вишня, яблоко, груша]

Длина списка

val fruits = mutableListOf("яблоко", "банан", "апельсин")
println(fruits.size) // 3

Перебор элементов (цикл for)

val fruits = mutableListOf("яблоко", "банан", "апельсин")
for (fruit in fruits) {
    println("Фрукт: $fruit")
}
// Вывод:
// Фрукт: яблоко
// Фрукт: банан
// Фрукт: апельсин

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

Задача «Фрукты» (список покупок)

Владелец магазина записывает фрукты каждый день. Нужно собрать все в один список и вывести.

fun main() {
    val fruits = mutableListOf<String>()
    
    println("Введите фрукты (для завершения введите 'стоп'):")
    while (true) {
        val input = readLine() ?: break
        if (input == "стоп") break
        fruits.add(input)
    }
    
    println("Список полученных фруктов:")
    for (fruit in fruits) {
        println("- $fruit")
    }
}

Задача «Робот-сортировщик» (поиск по условию)

Робот должен найти все детали с номером больше 100.

fun main() {
    val details = mutableListOf(45, 120, 89, 200, 55, 310, 77)
    val selected = mutableListOf<Int>()
    
    for (number in details) {
        if (number > 100) {
            selected.add(number)
        }
    }
    
    println("Детали для следующего этапа: $selected")
}

Задача «Запас материалов» (изменение по индексу)

Нужно удвоить количество хлеба во втором пункте списка (индекс 1).

fun main() {
    val supplies = mutableListOf(10, 5, 8, 12) // мука, хлеб, молоко, яйца
    println("Было: $supplies")
    
    supplies[1] = supplies[1] * 2  // удваиваем хлеб
    
    println("Стало: $supplies")
}

Задача «Суп в школе» (подсчет суммы)

Повар записал количество порций супа за неделю. Нужно узнать, сколько всего порций приготовили.

fun main() {
    val soupPortions = mutableListOf(15, 20, 18, 22, 17, 25, 19)
    var total = 0
    
    for (portion in soupPortions) {
        total += portion
    }
    
    println("Всего приготовлено порций супа: $total")
}

Задача «Юный альпинист» (поиск по условию)

Вася записывал высоту каждый день. Нужно найти дни, когда высота была больше 300 метров.

fun main() {
    val heights = mutableListOf(100, 350, 280, 400, 150, 500, 200)
    
    println("Дни, когда высота > 300 метров:")
    for (i in heights.indices) {
        if (heights[i] > 300) {
            println("День ${i + 1}: ${heights[i]} м")
        }
    }
}

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

  • Ошибка 1: Выход за границы списка. Если в списке 3 элемента (индексы 0, 1, 2), а вы обращаетесь к индексу 3 — программа «упадет». Всегда проверяйте размер списка: if (index < list.size).
  • Ошибка 2: Забыть про индексацию с 0. Первый элемент — это list[0], а не list[1].
  • Ошибка 3: Путать изменяемые и неизменяемые списки. listOf() создает неизменяемый список — его нельзя менять. Всегда используйте mutableListOf(), если планируете добавлять/удалять элементы.
  • Ошибка 4: Неправильный тип данных. Если список объявлен как mutableListOf<Int>(), вы не сможете добавить туда строку.
  • Ошибка 5: Забыть про readLine(). При вводе с клавиатуры используйте readLine() и проверяйте на null.

Итоговый пример: «Корзина покупок»

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

fun main() {
    // Создаем пустой список для названий продуктов
    val products = mutableListOf<String>()
    // И список для цен
    val prices = mutableListOf<Double>()
    
    println("Введите название продукта и его цену через пробел.")
    println("Для завершения введите 'стоп'")
    
    // Ввод данных
    while (true) {
        val input = readLine() ?: break
        if (input == "стоп") break
        
        val parts = input.split(" ")
        if (parts.size >= 2) {
            val name = parts[0]
            val price = parts[1].toDoubleOrNull()
            if (price != null) {
                products.add(name)
                prices.add(price)
            } else {
                println("Некорректная цена, попробуйте снова")
            }
        }
    }
    
    // Выводим корзину
    println("\nВаша корзина:")
    var total = 0.0
    for (i in products.indices) {
        println("${products[i]} — ${prices[i]} руб.")
        total += prices[i]
    }
    
    println("Итого: $total руб.")
    
    // Находим самый дорогой продукт
    if (prices.isNotEmpty()) {
        var maxPrice = prices[0]
        var maxIndex = 0
        for (i in prices.indices) {
            if (prices[i] > maxPrice) {
                maxPrice = prices[i]
                maxIndex = i
            }
        }
        println("Самый дорогой продукт: ${products[maxIndex]} (${maxPrice} руб.)")
    }
}

Что мы здесь сделали?

  • Создали два списка: для названий и для цен
  • Добавляли элементы через add()
  • Прошли по всем элементам с помощью цикла for
  • Нашли максимальный элемент (поиск по условию)
  • Посчитали сумму всех цен

Массивы и списки — это основа работы с данными. Освоив их, вы сможете решать самые разные задачи: от учета продуктов до сортировки деталей на заводе!