我正在使用此代码。
fun main(args : Array<String>){
val someArray : Array<Int> = arrayOf(3,53,2,521,51,23,512,34,124);
println("Original array is ")
someArray.forEach {print("$it , ")}
someArray.map({num -> num*2})
println("Changed array is ")
println()
someArray.forEach { print("$it , ") }
}
但地图功能似乎不起作用。这是打印的内容
原始阵列是 3,53,2,521,51,23,512,34,124,更改数组是
3,53,2,521,51,23,512,34,124,
我的问题是为什么数组的元素值不会翻倍?我在这里失踪了什么?
答案 0 :(得分:5)
您可以随时定义自己的扩展程序,以满足您的需求:
fun <T> Array<T>.mapInPlace(transform: (T) -> T) {
for (i in this.indices) {
this[i] = transform(this[i])
}
}
用法如下:
someArray.mapInPlace { num -> num * 2 }
请注意,原始数组有一些特殊的非泛型类,例如IntArray
(另请参阅this question),因此您可能应该使用这些类而不是通用类。当然,您必须分别为每个扩展定义此扩展,例如:
fun IntArray.mapInPlace(transform: (Int) -> Int) { ... }
fun DoubleArray.mapInPlace(transform: (Double) -> Double) { ... }
答案 1 :(得分:4)
从文档中,map
没有修改项目,而是返回一个List
,其中包含应用于所有项目的映射函数的结果:
返回一个列表,其中包含将给定转换函数应用于原始数组[或集合或映射中的每个元素的结果,具体取决于接收者]。
因此,要获得预期的结果,您应该执行以下操作:
val doubled = someArray.map { n -> n * 2}
doubled.forEach { print("$it , ") }
据我所知,没有内置功能允许您就地映射项目。但是,在您的情况下,您正在处理Array
,这是一个可变数据结构,因此替代方法是使用旧式循环迭代转换其项(您可以应用相同的逻辑MutableList
或使用Iterator
更新值的其他可变数据结构)。像这样:
fun main(args: Array<String>) {
val someArray: Array<Int> = arrayOf(3, 53, 2, 521, 51, 23, 512, 34, 124);
someArray.forEach { print("$it , ") }
println()
for (i in 0 until someArray.size) {
someArray[i] = someArray[i] * 2
}
someArray.forEach { print("$it , ") }
}
答案 2 :(得分:2)
一种替代方法是使用forEachIndexed
而不是map
。替换
someArray.map({num -> num*2})
作者
someArray.forEachIndexed{ index, num -> someArray[index] = num * 2 }
答案 3 :(得分:1)
正如许多人所说,地图会返回一个新列表,而不会修改原始列表。
重写预期代码的最有效方法是执行
// assuming you want to act upon individual elements in the list
fun main(args : Array<String>) {
val someArray : Array<Int> = arrayOf(3,53,2,521,51,23,512,34,124);
println("Original array is $someArray")
someArray
.map { it * 2 }
.forEach { print("$it , ") }
}
或者如果您只想查看以逗号分隔的值列表
// really just want to print the transformed values instead
fun main(args : Array<String>) {
val someArray : Array<Int> = arrayOf(3,53,2,521,51,23,512,34,124);
println("Original array is $someArray")
someArray
.map { it * 2 }
.also { print(it.joinToString()) }
}