Массивы (списки) в 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 - Нашли максимальный элемент (поиск по условию)
- Посчитали сумму всех цен
Массивы и списки — это основа работы с данными. Освоив их, вы сможете решать самые разные задачи: от учета продуктов до сортировки деталей на заводе!