fre*_*low 1 collections scala vector immutability trie
这就是我现在正在做的事情:
private var accounts = Vector.empty[Account]
def removeAccount(account: Account)
{
accounts = accounts.filterNot(_ == account)
}
Run Code Online (Sandbox Code Playgroud)
有更可读的解决方案吗?理想情况下,我想写accounts = accounts.remove(account).
不幸的是,如果相同的帐户出现两次,那么(也许)更糟糕的是,filterNot将删除它们.我可以提供的唯一可读性是使用
accounts.filter(_ != account)
Run Code Online (Sandbox Code Playgroud)
另一种可能性是使用具有删除操作的集合类型,例如TreeSet(在其中调用它-).如果你还没有重复的条目,那就Set完全可以了.(当然,对某些操作来说速度较慢,但它可能更适合应用程序 - 它更有效地删除单个条目; filterNot你基本上必须Vector再次构建整个.)
我会用这个:
accounts filterNot account.==
Run Code Online (Sandbox Code Playgroud)
这对我来说读起来很好,但是 ymmv。我也想要一个count不带谓词的,但集合库确实缺乏专门的方法,其中有谓词的人可以概括操作。
直到2.8.x之前,有是一个-方法,它得到了弃用,IIRC,因为语义问题。如果我的记忆对我有用,它实际上可以在 2.10 恢复,但它没有。编辑:我检查了它,发现它-现在保留用于修改它所应用的集合的可变方法。我完全赞成-:/:-虽然在序列上,将第一个或最后一个元素等于某物是有意义的。有人愿意为此买票吗?我会赞成它。:-)
您可以执行以下操作:
def removeFirst[T](xs: Vector[T], x: T) = {
val i = xs.indexOf(x)
if (i == -1) xs else xs.patch(i, Nil, 1)
}
Run Code Online (Sandbox Code Playgroud)
然后
accounts = removeFirst(accounts, account)
Run Code Online (Sandbox Code Playgroud)
不过,我认为问题的核心在于,Vector对于要提取内容的一组项目,可能不是正确的集合类型(提示:try Set)。如果要在ID或插入索引上建立索引,则Map可能是您想要的(确实具有-方法)。如果要高效地为多个事物建立索引,则需要一个数据库!