How to initialize an array in Kotlin with values?
在Java中,可以初始化数组,例如:
1 | int numbers[] = new int[] {10, 20, 30, 40, 50} |
Kotlin的数组初始化看起来如何?
1 | val numbers: IntArray = intArrayOf(10, 20, 30, 40, 50) |
有关详细信息,请参见Kotlin-基本类型。
值得一提的是,当使用Kotlin内置项(例如,
1 2 3 4 5 | // Array of integers of a size of N val arr = IntArray(N) // Array of integers of a size of N initialized with a default value of 2 val arr = IntArray(N) { i -> 2 } |
下面是一个例子:
1 2 3 4 5 6 | fun main(args: Array<String>) { val arr = arrayOf(1, 2, 3); for (item in arr) { println(item); } } |
号
您还可以使用操场测试语言功能。
科特林有几种方法。
1 | var arr = IntArray(size) // construct with only size |
然后简单地从用户、其他集合或任何您想要的地方获取初始值。
1 2 | var arr = IntArray(size, { 0 } ) // construct with size and fill array with 0 var arr = IntArray(size, { it * 1 } ) // construct with size and fill with its index |
。
我们还可以创建内置函数的数组,比如-
1 | var arr = intArrayOf(1, 2, 3, 4, 5) // create an array with 5 values |
另一种方式
1 2 | var arr = Array(size, { 0 } ) // it will create an integer array var arr = Array<String>(size, {"$it" } ) // this will create array with"0","1","2" and so on. |
。
您还可以使用
在Kotlin中,我们可以使用
例如:
1 2 3 4 5 | var Arr1 = arrayOf(1,10,4,6,15) var Arr2 = arrayOf<Int>(1,10,4,6,15) var Arr3 = arrayOf<String>("Surat","Mumbai","Rajkot") var Arr4 = arrayOf(1,10,4,"Ajay","Prakesh") var Arr5: IntArray = intArrayOf(5,10,15,20) |
。
旧问题,但如果要使用范围:
1 | var numbers: IntArray = IntRange(10, 50).step(10).toList().toIntArray() |
。
产生的结果几乎与以下结果相同:
1 | var numbers = Array(5, { i -> i*10 + 10 }) |
。
结果:10、20、30、40、50
我认为第一个选项的可读性要高一些。两者都有效。
你可以用这种方法
1 2 3 | var numbers=Array<Int>(size,init) var numbers=IntArray(size,init) var numbers= intArrayOf(1,2,3) |
。
例子
1 | var numbers = Array<Int>(5, { i -> 0 }) |
init表示默认值(初始化)
我认为值得一提的是,文档中不够直观的一点是,当您使用工厂函数创建数组并指定其大小时,数组初始化时使用的值等于其索引值。例如,在这样的数组中:
您可以这样创建一个int数组:
1 | val numbers = IntArray(5, { 10 * (it + 1) }) |
号
5是int数组大小。lambda函数是element init函数。它的范围在[0,4]内,加上1使范围在[1,5]内。
原点函数为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /** * An array of ints. When targeting the JVM, instances of this class are * represented as `int[]`. * @constructor Creates a new array of the specified [size], with all elements * initialized to zero. */ public class IntArray(size: Int) { /** * Creates a new array of the specified [size], where each element is * calculated by calling the specified * [init] function. The [init] function returns an array element given * its index. */ public inline constructor(size: Int, init: (Int) -> Int) ... } |
号
在array.kt中定义的intarray类
您可以尝试以下操作:
1 | var a = Array<Int>(5){0} |
号
您可以简单地使用现有的标准库方法,如下所示:
1 | val numbers = intArrayOf(10, 20, 30, 40, 50) |
号
但是,使用特殊的构造函数可能是有意义的:
1 | val numbers2 = IntArray(5) { (it + 1) * 10 } |
号
传递一个描述如何初始化值的大小和lambda。文件如下:
1 2 3 4 5 | /** * Creates a new array of the specified [size], where each element is calculated by calling the specified * [init] function. The [init] function returns an array element given its index. */ public inline constructor(size: Int, init: (Int) -> Int) |
Kotlin语言有专门的类来表示基本类型的数组,而不需要额外的装箱开销:例如,
1 | val myArr: IntArray = intArrayOf(10, 20, 30, 40, 50) |
号
…或者这样:
1 2 3 | val myArr = Array<Int>(5, { i -> ((i+1) * 10) }) myArr.forEach { println(it) } // 10, 20, 30, 40, 50 |
号
现在您可以使用它:
1 | myArr[0] = (myArr[1] + myArr[2]) - myArr[3] |
希望这有帮助。
我想知道为什么没有人给出最简单的答案:
1 | val array: Array<Int> = [1, 2, 3] |
根据对原始答案的一条评论,我意识到这只在注释参数中使用时才有效(这对我来说真的是出乎意料)。
看来Kotlin不允许在注释外创建数组文本。
例如,使用args4j库中的@option查看此代码:
1 2 3 4 5 6 | @Option( name ="-h", aliases = ["--help","-?"], usage ="Show this help" ) var help: Boolean = false |
选项参数"aliases"的类型为
在全局声明int数组
1 | var numbers= intArrayOf() |
号
下一个onCreate方法使用值初始化数组
1 2 3 4 5 6 | override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //create your int array here numbers= intArrayOf(10,20,30,40,50) } |
号
在我的情况下,我需要初始化我的抽屉项目。我用下面的代码填充数据。
1 2 3 4 5 6 7 8 | val iconsArr : IntArray = resources.getIntArray(R.array.navigation_drawer_items_icon) val names : Array<String> = resources.getStringArray(R.array.navigation_drawer_items_name) // Use lambda function to add data in my custom model class i.e. DrawerItem val drawerItems = Array<DrawerItem>(iconsArr.size, init = { index -> DrawerItem(iconsArr[index], names[index])}) Log.d(LOGGER_TAG,"Number of items in drawer is:"+ drawerItems.size) |
号
自定义模型类-
1 2 3 | class DrawerItem(var icon: Int, var name: String) { } |
号
这样初始化数组: