Рубрики
Без рубрики

Как инициализировать ArrayList в Kotlin

Для тех из вас, кто знаком с серией How to Python, я подумал, что было бы интересно попробовать свои силы… С тегом kotlin, java, android, новички.

Для тех из вас, кто знаком с Как использовать Python серии , Я подумал, что было бы интересно попробовать свои силы в некоторых других языках, которые я использую в последнее время. Сегодня давайте узнаем, как инициализировать ArrayList в Kotlin.

Введение в проблему

Как человек, пришедший с Java, я часто ловлю себя на том, что использую класс ArrayList для хранения данных. К сожалению, в Java нет чистого способа инициализации ArrayList, поэтому я задался вопросом, улучшил ли Kotlin эту проблему. Для справки, вот что я не хочу делать:

ArrayList list = new ArrayList()
list.add(7)
list.add(-4)
list.add(3)

Как вы, вероятно, можете себе представить, это решение плохо масштабируется. На самом деле, я даже не думаю, что это хорошо читается. Просто слишком много избыточной информации. Я бы предпочел иметь возможность сделать что-то вроде следующего:

ArrayList list = new ArrayList(7, -4, 3)

И для больших наборов данных было бы неплохо иметь возможность распределять значения по нескольким строкам:

ArrayList list = new ArrayList( 
    7, -4, 3, 2, 1, 3, 6, 5, 9, 11, 
    10, 7, -5, -6, 13, 6, -11, 13, 2, 1
)

К сожалению, это просто не так. Есть несколько неприятных обходных путей, но я надеялся, что Kotlin немного улучшит соглашения Java.

Решения

К счастью, Kotlin значительно улучшил детализацию Java, поэтому я обещаю, что есть лучший способ создать ArrayList. Вопрос только в том, как это сделать.

Инициализация ArrayList с помощью грубой силы

Естественно, мы можем перевести Java-решение почти напрямую:

val list = ArrayList()
list.add(7)
list.add(-4)
list.add(3)

Здесь мы создали пустой массив целых чисел. Затем мы заполнили этот список по одному элементу за раз, используя метод add() .

Конечно, нам бы хотелось чего-нибудь получше этого! Давайте посмотрим, что может предложить Kotlin.

Инициализация списка массивов путем преобразования

Один из способов сократить часть кода, приведенного выше, – создать массив перед преобразованием его в ArrayList:

val list = intArrayOf(7, -4, 3).toCollection(ArrayList())

В одной строке кода мы можем создать массив целых чисел, используя идеальный синтаксис. Из этого массива мы можем получить список массивов, используя метод to Collection() и передавая пустой список массивов. Затем метод to Collection() заполняет ArrayList всеми значениями в массиве.

Очевидно, что это не идеально, поскольку мы должны конвертировать между этими двумя типами. Было бы гораздо приятнее иметь возможность создавать и инициализировать ArrayList напрямую. К счастью, мы можем!

Инициализация ArrayList с помощью arraylist

Как оказалось, библиотека коллекций включает в себя функцию для создания ArrayList непосредственно в Kotlin:

val list = arrayListOf(7, -4, 3)

Я не совсем уверен, как этот метод работает под капотом, но я полагаю, что он работает аналогично нашему решению методом перебора:

fun  arrayListOf(vararg elements: T): ArrayList { 
    val list = ArrayList() 
    for (element in elements) { 
        list.add(element) 
    } 
    return list
}

В любом случае, у нас есть краткое решение для создания ArrayList. Это захватывающе!

Представление

Поскольку у меня вошло в привычку измерять производительность в Python, я подумал, что мог бы перенести эту идею на Kotlin. К счастью, существует стандартная функция, которая будет делать именно это: измерять НаноТайм . Мы будем использовать это для тестирования каждого из приведенных выше фрагментов кода:

import kotlin.system.measureNanoTime

val bruteForceTime = measureNanoTime { 
    val list = ArrayList() 
    list.add(7) 
    list.add(-4) 
    list.add(3)
}

val conversionTime = measureNanoTime { 
    val list = intArrayOf(7, -4, 3).toCollection(ArrayList())
}

val arrayListOfTime = measureNanoTime { 
    val list = arrayListOf(7, -4, 3)
}

println("Brute Force: $bruteForceTime")
println("Conversion: $conversionTime")
println("ArrayListOf: $arrayListOfTime")

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

Грубая сила: 38700

Конверсия: 14728800

ArrayListOf: 6319000

Для этого теста я закончил тем, что использовал measure nanoTime over measure Time Millis потому что я продолжал получать нулевое значение для метода грубой силы. Теперь в этом есть смысл!

Для справки, я протестировал все в Windows 10 с помощью Android Studio, чтобы настроить файл scratch с именем scratch.kts . Кроме того, я использовал Kotlin 1.3.31.

Небольшое Резюме

Как всегда, здесь представлены все решения в одном удобном месте:

// Brute force
val list = ArrayList()
list.add(7)
list.add(-4)
list.add(3)

// Array conversion
val list = intArrayOf(7, -4, 3).toCollection(ArrayList())

// Direct method
val list = arrayListOf(7, -4, 3)

Поскольку я только начинаю играть с Kotlin, это может показаться довольно тривиальным уроком. Тем не менее, я гарантирую, что начну копаться в более интересных темах. Например, я уже рад начать зеркальное отображение некоторых статей на Python.

Пока вы здесь, почему бы не поддержать Программиста-отступника, став участником . Вы получите доступ ко всем видам забавных статей, таких как:

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

Сообщение Как инициализировать ArrayList в Kotlin появилось впервые на Программист-отступник .

Оригинал: “https://dev.to/renegadecoder94/how-to-initialize-an-arraylist-in-kotlin-3mda”