For those of you familiar with the How to Python series, I thought it would be fun to try my hand at some other languages I’ve been using lately. Today, let’s learn how to initialize an ArrayList in Kotlin.
Problem Introduction
作为来自Java的人,我经常发现自己使用ArrayList类存储数据。 不幸的是,没有用Java初始化ArrayList的干净方法,所以我想知道Kotlin是否在此问题上有所改进。 供参考,这是我不想做的:
1 2 3 4 5 | <wyn>ArrayList<Integer> list = new ArrayList<Integer>() list.add(7) list.add(-4) list.add(3) </wyn> |
您可能会想到,此解决方案无法很好地扩展。 实际上,我什至不认为它读得很好。 冗余信息太多了。 我希望能够执行以下操作:
1 2 | <wyn>ArrayList<Integer> list = new ArrayList<Integer>(7, -4, 3) </wyn> |
而且,对于较大的数据集,能够将值分布在多行上会很好:
1 2 3 4 5 | <wyn>ArrayList<Integer> list = new ArrayList<Integer>( 7, -4, 3, 2, 1, 3, 6, 5, 9, 11, 10, 7, -5, -6, 13, 6, -11, 13, 2, 1 ) </wyn> |
不幸的是,事实并非如此。 有一些讨厌的解决方法,但是我希望Kotlin可以在Java约定上有所改进。
Solutions
幸运的是,Kotlin在Java的详细程度方面有了很大的改进,因此,我保证会有更好的方法来创建ArrayList。 只是一个问题。
Initializing an ArrayList by Brute Force
自然,我们几乎可以直接翻译Java解决方案:
1 2 3 4 | val list = ArrayList<Int>() list.add(7) list.add(-4) list.add(3) |
在这里,我们创建了一个空的整数ArrayList。 然后,我们使用加()方法。
当然,我们会比这更好的东西! 让我们看看Kotlin提供的服务。
Initializing an ArrayList by Conversion
从上面减少一些代码的一种方法是在将其转换为ArrayList之前创建一个Array:
1 | val list = intArrayOf(7, -4, 3).toCollection(ArrayList()) |
在一行代码中,我们可以使用理想的语法创建一个整数数组。 从该数组中,我们可以使用toCollection()方法并传递一个空的ArrayList。 的toCollection()然后,该方法使用数组中的所有值填充ArrayList。
显然,这并不理想,因为我们必须在两种类型之间进行转换。 能够直接创建和初始化ArrayList会更好。 幸运的是,我们可以!
Initializing an ArrayList with arrayListOf
事实证明,集合库包含一个用于直接在Kotlin中构建ArrayList的函数:
1 | val list = arrayListOf<Int>(7, -4, 3) |
我不确定这种方法在幕后如何工作,但我想它的工作原理类似于我们的蛮力解决方案:
1 2 3 4 5 6 7 | fun <T> arrayListOf(vararg elements: T): ArrayList<T> { val list = ArrayList<T>() for (element in elements) { list.add(element) } return list } |
无论如何,我们都有一个简洁的解决方案来构建ArrayList。 真令人兴奋!
Performance
自从养成了使用Python衡量性能的习惯以来,我认为我可以将这一想法转变为Kotlin。 幸运的是,有一个标准功能可以做到这一点:measureNanoTime。 我们将使用它来测试上面的每个代码段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import kotlin.system.measureNanoTime val bruteForceTime = measureNanoTime { val list = ArrayList<Int>() 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<Int>(7, -4, 3) } println("Brute Force: $bruteForceTime") println("Conversion: $conversionTime") println("ArrayListOf: $arrayListOfTime") |
就我而言,蛮力法比其他两种方法快得多,但是我不确定这些功能如何随着更多的输入而扩展。 随时尝试让我知道。 无论如何,这是结果:
蛮力:38700转换:14728800ArrayListOf:6319000
对于这个测试,我最终使用measureNanoTime过度measureTimeMillis因为我一直将蛮力法的值设为零。 现在,这很有意义!
作为参考,我使用Android Studio在Windows 10上测试了所有内容,以设置名为临时文件。 另外,我使用了Kotlin 1.3.31。
A Little Recap
与往常一样,这里所有解决方案都集中在一个方便的位置:
1 2 3 4 5 6 7 8 9 10 11 | // Brute force val list = ArrayList<Int>() list.add(7) list.add(-4) list.add(3) // Array conversion val list = intArrayOf(7, -4, 3).toCollection(ArrayList()) // Direct method val list = arrayListOf<Int>(7, -4, 3) |
由于我刚开始玩Kotlin,所以这看起来像是一个简单的教程。 就是说,我保证我会开始研究更多有趣的话题。 例如,我很高兴开始镜像一些Python文章。
While you’re here, why not support The Renegade Coder by becoming a member. You’ll get access to all kinds of fun articles like:
- Working with Challenging College Students
- 11 Reasons Why I Quit My Engineering Career
Of course, you’re welcome to just hop on the newsletter and decide at a later date. Either way, I appreciate the support.
The post How to Initialize an ArrayList in Kotlin appeared first on ?he Renegade Coder.
from: https://dev.to//renegadecoder94/how-to-initialize-an-arraylist-in-kotlin-3mda