【发布时间】:2019-08-23 11:16:30
【问题描述】:
假设我有一个case class A(id: Int, str: String) 的列表和一个A 的实例。我需要用新实例替换列表中的一个项目,或者将新实例附加到列表中。
case class A(id: Int, str: String)
def replaceOrAppend(as: List[A], a: A): List[A] = ???
val as = List(A(1, "a1"), A(2, "a2"), A(3, "a3"))
replaceOrAppend(as, A(2, "xyz")) // List(A(1, "a1"), A(2, "xyz"), A(3, "a3"))
replaceOrAppend(as, A(5, "xyz")) // List(A(1, "a1"), A(2, "a2"), A(3, "a3"), A(5, "xyz"))
我可以这样写replaceOrAppend:
def replaceOrAppend(as: List[A], a: A): List[A] =
if (as.exists(_.id == a.id)) as.map(x => if (x.id == a.id) a else x) else as :+ a
这个实现有点笨拙,而且显然不是最理想的,因为它两次通过输入列表。如何实现replaceOrAppend只传递一次输入列表?
【问题讨论】:
-
考虑到
id作为键,为什么不使用Map而不是List... -
假设给定了
replaceOrAppend签名。当然,您可以将列表转换为地图,将元素添加到地图中,然后再次将地图转换为列表。我只是不确定这会是更好的方法。 -
为什么需要列表,顺序重要吗?
-
这看起来是一个 X/Y 问题(假设
List是正确的方法......) -
@LuisMiguelMejíaSuárez 是的,输入列表顺序很重要。
标签: scala collections