什么是fp风格的做“天真的hashmap”的方式

时间:2013-01-08 18:18:56

标签: scala functional-programming

我有一对格式为(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 超线性?也许这是一个简单的问题,但我无法理解...希望有人可以提供帮助。谢谢!

1 个答案:

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