Scala中如何将IndexedSeq[Array[Int]]转为Array[Array[Int]]?
解决Scala二维数组元素乘值后保持原类型的问题
你遇到的问题核心在于遍历对象的类型:当你遍历m.indices(这是一个Range,属于IndexedSeq)时,yield返回的结果会是IndexedSeq类型;而直接遍历数组m本身,yield会返回和原数组同类型的结果。
下面提供两种可行的解决方案:
方案1:直接遍历数组行(推荐)
不需要通过索引访问,直接遍历二维数组的每一行,这样yield会直接返回Array[Array[Int]]:
val m = Array( Array(1,2,3), Array(4,5,6), Array(7,8,9) ) val value = 3 val result = for (row <- m) yield row.map(_ * value) // 结果类型:Array[Array[Int]] = Array(Array(3, 6, 9), Array(12, 15, 18), Array(21, 24, 27))
原理:Scala的for推导式会根据遍历的集合类型返回对应类型的结果,遍历Array时,输出自然也是Array。
方案2:基于索引遍历后转换类型
如果一定要通过索引操作,只需将整个yield的结果调用.toArray,把外层的IndexedSeq转为Array即可:
val result = (for (i <- m.indices) yield m(i).map(x => x * value)).toArray // 结果类型:Array[Array[Int]] = Array(Array(3, 6, 9), Array(12, 15, 18), Array(21, 24, 27))
注意:这里需要把整个for表达式用括号包裹,再调用.toArray——如果只是给map的结果加.toArray,不会改变外层集合的类型,这也是你之前尝试直接追加无效的原因。
内容的提问来源于stack exchange,提问作者fleo
相关产品推荐
相关产品推荐

