ChatGPT解决这个技术问题 Extra ChatGPT

如何用值初始化 Kotlin 中的数组?

在 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 范围。

M
Maroun
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<Int> 有优势吗?
@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
G
Gastón Saillén

值得一提的是,当使用 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 -> 2} 甚至(使用常量初始化时)IntArray(N) {2}
代替 i 我们可以使用 "_" var arr = IntArray(N){ _ -> false}
带有 lambda 的那个正是我需要初始化一个具有动态大小和非可选默认值的数组。谢谢!
D
Det

在 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} 相同
s
shadeglare

这是一个例子:

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

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


一条评论,要打印数组的值,我们可以使用 array.joinToString(" ") 代替循环。
工作,但看起来更多的是用 Kotlin 编写的 Java,而不是惯用的 Kotlin :)
F
Felipe Augusto

在 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 保留原语
B
Brooks DuBois

老问题,但如果你想使用一个范围:

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

产生几乎相同的结果:

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

结果:10、20、30、40、50

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


A
Andy Jazz

Kotlin 有专门的类来表示原始类型的数组,而无需装箱开销。例如 - IntArrayShortArrayByteArray 等。我需要说的是,这些类与父 Array 类没有继承关系,但它们具有相同的方法和属性集。它们中的每一个也都有相应的工厂函数。因此,要在 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]

A
Ali Hasan

你可以使用这个方法

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<Int>()IntArray() 中给出 init 的示例会有所帮助,但到目前为止,您的答案并没有太大帮助。
答案已修改
Array 为您提供了一个装箱整数数组,而 IntArray 为您提供了一个实际的 int 数组。
A
Alf Moh

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


z
zyc zyc

您可以像这样创建一个 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 类


F
Fahed Hermoza

我的回答补充了@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}

k
kulst

你可以试试这个:

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

s
s1m0nw1

您可以简单地使用现有的标准库 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)

h
hdkrus

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

val 数组:Array = [1, 2, 3]

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

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

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

@Option(
        name = "-h",
        aliases = ["--help", "-?"],
        usage = "Show this help"
    )
    var help: Boolean = false

选项参数“别名”的类型为 Array<String>


这段代码出现以下错误:不支持 [注释之外的集合文字]
我以前没见过这个。这种语法对 Kotlin 来说是新的吗?
@LarsBlumberg,可能,我最近才开始将 Kotlin 与 IntelliJ 2019.1 一起使用,并且我初始化了一个字符串数组,就像我展示的那样并且它有效
@RémiP,好点,我在注释参数上使用了它。但这意味着数组文字在某些情况下有效,而在其他情况下则无效?
@hdkrus 为什么不更新答案以显示数组初始化如何与注释一起使用?这对于这个问题的许多读者来说可能是有价值的。
N
Nolequen

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

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

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

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

R
Rahul

就我而言,我需要初始化我的抽屉项目。我通过以下代码填充数据。

    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 函数添加项目的评论。
至少与其他答案相比,这似乎仍然是解决此问题的一种复杂方法。我还查看了我之前的消息,回想起来似乎很苛刻 - 对不起。
那很好,没有问题。我只是试图以解决我的问题的方式回答,我没有与其他答案进行比较。谢谢!
A
Abhilash Das

以这种方式初始化数组:val paramValueList : Array<String?> = arrayOfNulls<String>(5)


N
Nihal Desai

在全局声明 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)
}

虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
Z
Zafar Iqbal

简单方法:

对于整数:

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

保留所有数据类型

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


S
Samad Talukder

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

N
Nikhil Katekhaye

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

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

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

对于二维数组:

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

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


T
Thiago

这是一个简单的例子

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