如何在kotlin中初始化一个二维不可空字符串数组

How in kotlin to initialize a two dimensional non-nullable string array

有两个痴呆的字符串数组,并且该行只有两个项目,

i.e. {{"1", "a"} {"2", "b"}, {"3", "c"} ... ...}

进行反转的反转函数

public static String[][] invert(final String[][] array) {
    final String[][] newarray = new String[array.length][2];
    for(int i = 0; i<array.length; i++) {
        newarray[i][0] = array[i][1];
        newarray[i][1] = array[i][0];
    }
    return newarray;
}

翻译成科特林:

  1. fun invert(array: Array<Array<String?>>): Array<Array<String?>> {
        val newarray = Array<Array<String?>>(array.size) { arrayOfNulls(2) }
        for (i in array.indices) {
            newarray[i][0] = array[i][1]
            newarray[i][1] = array[i][0]
        }
        return newarray
    }
    

因为arrayOfNulls(2),不得不定义两个痴呆数组为Array<Array<String?>>

但是 Array<Array<String?>> 的 return 类型破坏了很多期望 Array<Array<String>>

的代码
  1. 使用val newarray = Array<Array<String>>(array.size) { Array<String>(2) {""}}强制数组初始化所有行为空字符串(因此不为空)。

    fun invert(array: Array<Array<String>>): Array<Array<String>> {
        val newarray = Array<Array<String>>(array.size) { Array<String>(2) {""}}
        for (i in array.indices) {
            newarray[i][0] = array[i][1]
            newarray[i][1] = array[i][0]
        }
        return newarray
    }
    

这是唯一的方法吗,还是有像

这样的功能
fun strinagArrayOf(vararg elements: String): Array<String>

那个翻译让你偏离了轨道;没有理由初始化并再次遍历字段。

这是您正在使用的构造函数的签名:

/**
 * Creates a new array with 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) -> T)

您实际上可以为 init 函数中的每个项目传递您自己的初始化逻辑。您甚至可以获得正在初始化的项目的索引(这是唯一的参数,因此未明确声明但可以访问 it)。

所以为了得到你需要的东西,你可以在那里简单地初始化倒排数组(为了便于阅读,将参数从 array 更改为 input):

fun invert(input: Array<Array<String>>) = Array(input.size) {arrayOf(input[it][1], input[it][0]) }