如何在Kotlin中初始化二维不可为空的字符串数组

时间:2018-08-06 21:13:52

标签: arrays kotlin non-nullable

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

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

翻译成Kotlin:

  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?>>破坏了很多期望Array<Array<String>>的代码

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

    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>

1 个答案:

答案 0 :(得分:3)

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

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

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