arrays - Kotlin 数组 <初始化

标签 arrays kotlin built-in array-initialization

这个问题在这里已经有了答案:





Order of init calls in Kotlin Array initialization

(2 个回答)


2年前关闭。




我将从字节流中读取数据。 Kotlin 是否为数组生成函数提供了索引(如 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-array/-init-.html 中所述)保证从零开始按顺序调用?
Array.kt文件在 builtins 下所以我不知道在哪里可以找到实际的代码。

最佳答案

看看at the source code for Array :

public inline constructor(size: Int, init: (Int) -> T)

init参数是一个函数,它接受一个 int(特定项的索引),它期望返回 T 类型的值,数组由该值组成。

正如其他答案通过示例所显示的那样,这些是按顺序调用的,因为这是“自然”的做法。如果您不明白我的意思,请考虑实现替代方案:
for (i in 0..size) {
    this.addToArray(init(i));
}

或者:
for (i in (size - 1)..0 {
    this.addToArray(init(i));
}

相比:
val indices = mutableListOf<Int>()
while (indices.size != size) {
    val i = random.nextInt(size); 
    if (i !in indices) {
        indices.add(i);
        this.addToArray(init(i));
    }
}

虽然我们看不到构造函数的源代码,但仅在其他答案中显示的示例就表明它们不能使用随机方法。应用来自 the first answer 的代码,从数学上讲,使用随机并按顺序打印出 0-49 的几率极低。

此外,这是 backed up by an answer here .生成的编译后的 Java 代码创建了一个从 0 到 size 的 for 循环。对于 JVM,假设它们不更改实现,您可以假设它会从 0 变为 size。但是无论是从 0 到 size 还是从 size 到 0,如果您不喜欢顺序,您可以随时将其反转。

如果您需要 100% 确定它从 0 到大小,或者如果实现发生变化,您可以执行以下操作:
var a = (0 until 10).step(1).toList().toTypedArray()

在这种情况下,它会生成一个数字为 0-9 的数组。

如果您想要对象,或以其他方式更改对象,您可以添加 .map {}在创建列表之前。话虽如此,只要init,这是一种矫枉过正的选择。功能如您所愿。

您始终可以通过使用 IntelliJ、Android Studio、其他一些 IDE 或您选择的反编译器反编译代码来确认。但是无论实现如何,它们总是按顺序结束 - 所以你不必担心。他们唯一可能改变的是调用 init 函数的顺序,但它仍然会在结果数组中以相同的顺序结束。

关于arrays - Kotlin 数组 <初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56821876/

相关文章:

c++ - 为什么这段将 std::array 转换为 std::string 的代码不显示任何内容?

kotlin - 喷气背包组合中给定背景错误的 'on' 颜色冲突

java - 在类中定义数组时出错

javascript - 从 Java 创建 JavaScript 对象数组

javascript - 简单的动态二维数组问题

kotlin - 从 Dart 向 Kotlin 发送回调函数

android - Kotlin 协程不等待网络结果返回

c++ - 如何在 MacOS 上的 g++ 中使用 gcc 内置 __sync_bool_compare_and_swap?

python - 连接音频文件 [Python 2.7]

bash - shell 内置工具