Scala-创建一个新列表并更新现有列表中的特定元素

时间:2018-11-09 20:32:08

标签: scala

我还是Scala和新OOP的新手。创建新列表时,如何更新列表中的特定元素。

val numbers= List(1,2,3,4,5)
val result = numbers.map(_*2) 

我只需要更新第三个元素->乘以2。如何使用map来做到这一点?

4 个答案:

答案 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)。