Для тех из вас, кто знаком с Как использовать Python серии , Я подумал, что было бы интересно попробовать свои силы в некоторых других языках, которые я использую в последнее время. Сегодня давайте узнаем, как инициализировать ArrayList в Kotlin.
Введение в проблему
Как человек, пришедший с Java, я часто ловлю себя на том, что использую класс ArrayList для хранения данных. К сожалению, в Java нет чистого способа инициализации ArrayList, поэтому я задался вопросом, улучшил ли Kotlin эту проблему. Для справки, вот что я не хочу делать:
ArrayListlist = new ArrayList () list.add(7) list.add(-4) list.add(3)
Как вы, вероятно, можете себе представить, это решение плохо масштабируется. На самом деле, я даже не думаю, что это хорошо читается. Просто слишком много избыточной информации. Я бы предпочел иметь возможность сделать что-то вроде следующего:
ArrayListlist = new ArrayList (7, -4, 3)
И для больших наборов данных было бы неплохо иметь возможность распределять значения по нескольким строкам:
ArrayListlist = 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)
Я не совсем уверен, как этот метод работает под капотом, но я полагаю, что он работает аналогично нашему решению методом перебора:
funarrayListOf(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”