我有一对格式为(a: A, x: Int)
的列表,而x
在列表中没有重复。现在我知道x
在某个范围内0 until n
,我想创建一个大小为n
的数组,其i
元素的类型为Option[A]
。如果原始列表中有一对(a, i)
,则为Some(a)
,否则为None
。一个简单的例子:
Original List (n = 6):
(a1, 1)
(a2, 2)
(a3, 5)
Desired Output:
(0, None)
(1, Some(a1))
(2, Some(a2))
(3, None)
(4, None)
(5, Some(a3))
当然,我们可以获得一个可变数组,浏览原始列表并填写相应的元素。但是fp风格的做法是什么,考虑到时间复杂性不应该与n
超线性?也许这是一个简单的问题,但我无法理解...希望有人可以提供帮助。谢谢!
答案 0 :(得分:3)
如果你有大量的收藏和许多/大的差距,这将浪费内存。我建议您改用Map[Int,B]
并使用get
操作,该操作返回Option[B]
。交换可以按如下方式进行:
scala> List("a1"->1, "a2"->2, "a3"->5)
res3: List[(java.lang.String, Int)] = List((a1,1), (a2,2), (a3,5))
// swap the elements and create a Map
scala> res3.map(_.swap).toMap
res4: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> a1, 2 -> a2, 5 -> a3)
scala> res3.map(_.swap).toMap.get(3)
res5: Option[java.lang.String] = None
scala> res3.map(_.swap).toMap.get(1)
res6: Option[java.lang.String] = Some(a1)