【发布时间】:2021-12-05 00:53:17
【问题描述】:
在处理Advent of Code 难题时,我发现自己定义了一个函数来转置整数矩阵:
fun transpose(xs: Array<Array<Int>>): Array<Array<Int>> {
val cols = xs[0].size // 3
val rows = xs.size // 2
var ys = Array(cols) { Array(rows) { 0 } }
for (i in 0..rows - 1) {
for (j in 0..cols - 1)
ys[j][i] = xs[i][j]
}
return ys
}
原来在下面的谜题中我还需要转置一个矩阵,但它不是Ints 的矩阵,所以我试图概括。在 Haskell 中我会有一些类型的东西
transpose :: [[a]] -> [[a]]
为了在 Kotlin 中复制它,我尝试了以下方法:
fun transpose(xs: Array<Array<Any>>): Array<Array<Any>> {
val cols = xs[0].size
val rows = xs.size
var ys = Array(cols) { Array(rows) { Any() } } // maybe this is the problem?
for (i in 0..rows - 1) {
for (j in 0..cols - 1)
ys[j][i] = xs[i][j]
}
return ys
}
这看起来不错,但事实并非如此。事实上,当我尝试在原始整数矩阵上调用它时,我得到Type mismatch: inferred type is Array<Array<Int>> but Array<Array<Any>> was expected。
问题是,我不太明白这条错误信息:我认为 Any 是其他任何东西的超类型?
谷歌搜索我想我明白我应该使用某种类型约束语法(抱歉,不确定它在 Kotlin 中的调用方式),因此将类型更改为 fun <T: Any> transpose(xs: Array<Array<T>>): Array<Array<T>>,但随后在返回行我得到 @ 987654331@
所以我的问题是,如何编写适用于任何二维数组的transpose 矩阵?
【问题讨论】:
-
如果有兴趣,您可以查看 my solution 了解 AdventOfCode 拼图。在那里,我从行列表中创建了一个列列表。
-
很高兴在 Kotlin 中看到另一个 AoC 存储库! :) 我的是here。我这几天时间不多,所以我想我以后会回到第 2 部分,所以我不会看你的解决方案,不要有任何剧透
标签: kotlin generics polymorphism