【问题标题】:How to initialize an array in Kotlin with values?如何用值初始化 Kotlin 中的数组?
【发布时间】:2015-09-30 16:56:16
【问题描述】:

在Java中可以初始化一个数组,例如:

int numbers[] = new int[] {10, 20, 30, 40, 50}

Kotlin 的数组初始化是什么样子的?

【问题讨论】:

  • 文档在某种程度上隐藏了答案。他们没有给出源代码示例,而是在旁注中提到了(不推荐使用的)array() 函数: 要创建一个数组,我们可以使用库函数 array() 并将项目值传递给它,这样数组(1, 2, 3) 创建一个数组 [1, 2, 3]。
  • 虽然我喜欢 Kotlin,但我说“Kotlin 文档”还不够好(我从其他网站学到了比 kotlinlang.org 更多的东西)。
  • 有时您只需要一个 intRange,您可以这样做:val numbers = 1..5 它给出了一个从 1 到 5 的 int 范围。

标签: arrays kotlin


【解决方案1】:

在下面初始化字符串检查时

val strings = arrayOf("January", "February", "March")

我们可以使用其专用的 arrayOf 方法轻松地初始化一个原始 int 数组:

val integers = intArrayOf(1, 2, 3, 4)

【讨论】:

    【解决方案2】:

    对于二维数组:

    val rows = 3
    val cols = 3
    val value = 0
    val array = Array(rows) { Array<Int>(cols) { value } }
    

    您可以将元素类型更改为您想要的任何类型(字符串、类...),并将值更改为相应的默认值。

    【讨论】:

      【解决方案3】:

      这是一个简单的例子

      val id_1: Int = 1
      val ids: IntArray = intArrayOf(id_1)
      

      【讨论】:

        【解决方案4】:

        Kotlin 语言有专门的类来表示原始类型的数组而没有装箱开销:例如 - IntArrayShortArrayByteArray 等。我需要说的是,这些类与父 @ 没有继承关系987654324@ 类,但它们具有相同的方法和属性集。它们中的每一个也都有相应的工厂函数。因此,要在 Kotlin 中使用值初始化数组,您只需输入以下内容:

        val myArr: IntArray = intArrayOf(10, 20, 30, 40, 50)
        

        ...或者这样:

        val myArr = Array<Int>(5, { i -> ((i+1) * 10) })
        
        myArr.forEach { println(it) }                            // 10, 20, 30, 40, 50
        

        现在你可以使用它了:

        myArr[0] = (myArr[1] + myArr[2]) - myArr[3]
        

        【讨论】:

          【解决方案5】:
          val numbers: IntArray = intArrayOf(10, 20, 30, 40, 50)
          

          详情请见Kotlin - Basic Types

          你也可以提供一个初始化函数作为第二个参数:

          val numbers = IntArray(5) { 10 * (it + 1) }
          // [10, 20, 30, 40, 50]
          

          【讨论】:

          • 使用intArrayOf 是否优于arrayOf?那么IntArrayArray&lt;Int&gt; 有优势吗?
          • @LarsBlumberg IntArray 等于 int[],Array 等于 Integer[]
          • 初始化列表非常相似:listOf(10, 20, 30, 40, 50)
          • 当我使用 intArrayOf() 函数时,我面对的是Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/KotlinPackage。我正在使用jdk1.8.0_241 和 Intellij IDEA
          【解决方案6】:

          我的回答补充了@maroun 这些是初始化数组的一些方法:

          使用数组

          val numbers = arrayOf(1,2,3,4,5)
          

          使用严格的数组

          val numbers = intArrayOf(1,2,3,4,5)
          

          混合类型的矩阵

          val numbers = arrayOf(1,2,3.0,4f)
          

          嵌套数组

          val numbersInitials = intArrayOf(1,2,3,4,5)
          val numbers = arrayOf(numbersInitials, arrayOf(6,7,8,9,10))
          

          能够从动态代码开始

          val numbers = Array(5){ it*2}
          

          【讨论】:

            【解决方案7】:

            简单的方法:

            对于整数:

            var number = arrayOf (10 , 20 , 30 , 40 ,50)

            保留所有数据类型

            var number = arrayOf(10 , "字符串值" , 10.5)

            【讨论】:

              【解决方案8】:

              在 Kotlin 中有几种方法。

              var arr = IntArray(size) // construct with only size
              

              然后只需从用户或其他集合或您想要的任何地方获取初始值。

              var arr = IntArray(size){0}  // construct with size and fill array with 0
              var arr = IntArray(size){it} // construct with size and fill with its index
              

              我们也可以使用内置函数创建数组-

              var arr = intArrayOf(1, 2, 3, 4, 5) // create an array with 5 values
              

              另一种方式

              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.
              

              您也可以使用doubleArrayOf()DoubleArray() 或任何原始类型来代替Int。

              【讨论】:

              • var arr = IntArray(size, { it * 1 } )var arr = IntArray(size){it} 相同
              【解决方案9】:

              这样就可以在koltin中初始化int数组了。

               val values: IntArray = intArrayOf(1, 2, 3, 4, 5,6,7)
              

              【讨论】:

              • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
              【解决方案10】:

              在Java中可以初始化一个数组,例如:

              int numbers[] = new int[] {10, 20, 30, 40, 50}
              

              但在 Kotlin 中,数组初始化有多种方式,例如:

              您可以使用任何通用类型的数组 arrayOf() 函数:

              val arr = arrayOf(10, 20, 30, 40, 50)
              
              val genericArray = arrayOf(10, "Stack", 30.00, 40, "Fifty")
              

              使用 Kotlin 的实用函数可以初始化数组

              val intArray = intArrayOf(10, 20, 30, 40, 50)
              

              【讨论】:

                【解决方案11】:

                值得一提的是,当使用 kotlin 内置函数(例如 intArrayOf()longArrayOf()arrayOf() 等)时,您无法使用给定大小的默认值(或所有值)初始化数组,相反,您需要根据类构造函数通过调用进行初始化。

                // 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 }
                

                【讨论】:

                • 使用 lambda 的第二个默认值 init 非常有帮助!谢谢
                • 第二种初始化形式可以写成:IntArray(N) {i -&gt; 2}甚至(用常量初始化时)IntArray(N) {2}
                • 我们可以使用 "_" var arr = IntArray(N){ _ -> false} 代替 i
                • 带有 lambda 的那个正是我初始化具有动态大小和非可选默认值的数组所需要的。谢谢!
                【解决方案12】:

                我想知道为什么没有人给出最简单的答案:

                val array: Array<Int> = [1, 2, 3]
                

                根据我原始答案的其中一个 cmets,我意识到这仅在用于注释参数时才有效(这对我来说真的出乎意料)。

                看起来 Kotlin 不允许在注释之外创建数组字面量。

                例如,使用 args4j 库中的 @Option 查看这段代码:

                @选项( 名称=“-h”, 别名 = ["--help", "-?"], 用法 = "显示此帮助" ) var帮助:布尔=假

                选项参数“别名”的类型为Array&lt;String&gt;

                【讨论】:

                • 这段代码出现以下错误:Unsupported [Collection literals outside annotations]
                • 我以前没见过这个。这种语法对 Kotlin 来说是新的吗?
                • @LarsBlumberg,可能,我最近才开始在 IntelliJ 2019.1 中使用 Kotlin,我初始化了一个字符串数组,就像我展示的那样,它工作了
                • @RémiP,好点,我在注释参数上使用了它。但这意味着数组字面量在某些情况下有效,而在另一些情况下则无效?
                • @hdkrus 为什么不更新答案以显示数组初始化如何与注释一起使用?这对于本问题的许多读者来说可能很有价值。
                【解决方案13】:

                在 Kotlin 中,我们可以使用 arrayOf()intArrayOf()charArrayOf()booleanArrayOf()longArrayOf() 函数创建数组。

                例如:

                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)  
                

                【讨论】:

                • 请重新格式化此答案,以便清楚什么是代码和什么是注释。
                • 仅供阅读此答案的任何人使用...使用arrayOf作为基元的优化不如说intArrayOf。此外,arrayOf 创建对象,而 inArrayOf 保留原语
                【解决方案14】:

                您可以简单地使用现有的标准库methods,如下所示:

                val numbers = intArrayOf(10, 20, 30, 40, 50)
                

                虽然使用特殊的构造函数可能是有意义的:

                val numbers2 = IntArray(5) { (it + 1) * 10 }
                

                您传递一个大小和一个描述如何初始化值的 lambda。这是文档:

                /**
                 * 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)
                

                【讨论】:

                  【解决方案15】:

                  在全局声明 int 数组

                  var numbers= intArrayOf()
                  

                  下一个 onCreate 方法用值初始化你的数组

                  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)
                  }
                  

                  【讨论】:

                  • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
                  【解决方案16】:

                  你可以像这样创建一个 Int 数组:

                  val numbers = IntArray(5, { 10 * (it + 1) })
                  

                  5 是 Int 数组大小。 lambda 函数是元素初始化函数。 'it' 范围在 [0,4] 中,加上 1 个在 [1,5] 中的范围

                  原点函数是:

                   /**
                   * 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)
                    ...
                   }
                  

                  Arrays.kt 中定义的 IntArray 类

                  【讨论】:

                    【解决方案17】:

                    以这种方式初始化数组:val paramValueList : Array&lt;String?&gt; = arrayOfNulls&lt;String&gt;(5)

                    【讨论】:

                      【解决方案18】:

                      你可以试试这个:

                      var a = Array<Int>(5){0}
                      

                      【讨论】:

                        【解决方案19】:

                        在我的情况下,我需要初始化我的抽屉项目。我用下面的代码填充数据。

                            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)
                        

                        自定义模型类-

                        class DrawerItem(var icon: Int, var name: String) {
                        
                        }
                        

                        【讨论】:

                        • 这并没有真正以明智的方式回答问题。
                        • 请查看我使用 lambda 函数添​​加项目的评论。
                        • 这似乎仍然是解决此问题的一种复杂方法,至少与其他答案相比。我也看了我之前的消息,回想起来似乎很苛刻 - 对不起。
                        • 没关系,没问题。我只是试图以解决我的问题的方式回答,我没有与其他答案进行比较。谢谢!
                        【解决方案20】:

                        我认为值得一提但文档不够直观的是,当您使用工厂函数创建一个数组并指定它的大小时,该数组的初始化值等于它们的值指数值。例如,在这样的数组中: val array = Array(5, { i -&gt; i }),分配的初始值是[0,1,2,3,4],而不是[0,0,0,0,0]。这就是为什么从文档中,val asc = Array(5, { i -&gt; (i * i).toString() }) 产生["0", "1", "4", "9", "16"] 的答案

                        【讨论】:

                          【解决方案21】:

                          老问题,但如果您想使用范围:

                          var numbers: IntArray = IntRange(10, 50).step(10).toList().toIntArray()
                          

                          产生几乎相同的结果:

                          var numbers = Array(5, { i -> i*10 + 10 })
                          

                          结果:1​​0、20、30、40、50

                          我认为第一个选项更具可读性。两者都有效。

                          【讨论】:

                            【解决方案22】:

                            你可以使用这个方法

                            var numbers=Array<Int>(size,init)
                            var numbers=IntArray(size,init)
                            var numbers= intArrayOf(1,2,3)
                            

                            例子

                            var numbers = Array<Int>(5, { i -> 0 })
                            

                            init代表默认值(初始化)

                            【讨论】:

                            • 如果您在Array&lt;Int&gt;()IntArray() 中提供init 的示例,这会有所帮助,您的回答目前还没有太大帮助。
                            • 答案已修改
                            • Array 给你一个装箱的整数数组,而 IntArray 给你一个实际的 int 数组。
                            【解决方案23】:

                            这是一个例子:

                            fun main(args: Array<String>) {
                                val arr = arrayOf(1, 2, 3);
                                for (item in arr) {
                                    println(item);
                                }
                            }
                            

                            您还可以使用playground 来测试语言功能。

                            【讨论】:

                            • 一条注释,要打印数组的值,我们可以使用 array.joinToString(" ") 来代替循环。
                            • 工作,但看起来更像是用 Kotlin 编写的 Java,而不是惯用的 Kotlin :)
                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 2020-02-04
                            • 1970-01-01
                            • 1970-01-01
                            • 2019-09-29
                            • 2021-04-24
                            • 2022-08-19
                            • 1970-01-01
                            相关资源
                            最近更新 更多