我还是Scala和新OOP的新手。创建新列表时,如何更新列表中的特定元素。
val numbers= List(1,2,3,4,5)
val result = numbers.map(_*2)
我只需要更新第三个元素->乘以2。如何使用map
来做到这一点?
答案 0 :(得分:1)
您可以使用zipWithIndex
将列表映射到元组列表,其中每个元素都带有其索引。然后,将map
与模式匹配一起使用-您可以选择第三个元素(索引= 2):
val numbers = List(1,2,3,4,5)
val result = numbers.zipWithIndex.map {
case (v, i) if i == 2 => v * 2
case (v, _) => v
}
// result: List[Int] = List(1, 2, 6, 4, 5)
或者-您可以使用patch
,它用提供的子序列替换子序列:
numbers.patch(from = 2, patch = Seq(numbers(2) * 2), replaced = 1)
答案 1 :(得分:1)
我认为最简单的方法是使用updated(index: Int, elem: Int)
。对于您的示例,可以按以下方式应用它:
val result = numbers.updated(2, numbers(2) * 2)
答案 2 :(得分:0)
list.zipWithIndex
创建一个成对的列表,其原始元素在左侧,索引在列表的右侧(索引基于0,因此“第三个元素”位于索引2)。
val result = number.zipWithIndex.map {
case (n, 2) => n*2
case n => n
}
这将创建一个包含这些对的中间列表,然后对其进行映射以进行转换。一种更有效的方法是使用iterator
。迭代器是一个“惰性”,因此,与其创建一个中间容器,不如创建一个中间容器,并将它们直接发送到.map
:
val result = number.iterator.zipWithIndex.map {
case (n, 2) => n*2
case n => n
}.toList
答案 3 :(得分:0)
第一个也是最重要的标量是FOP而不是OOP。您可以通过关键字“ updated”更新列表的任何元素,有关详细信息,请参见以下示例:
签名:-已更新(索引,值)
val numbers= List(1,2,3,4,5)
print(numbers.updated(2,10))
现在,这里的第一个参数是索引,第二个参数是值。此代码的结果会将列表修改为: 列出(1、2、10、4、5)。