Scala 如果项目已经存在,如何增加内部列表中的计数器
我的TitleStats案例类有一个内部列表。我想在列表中添加一个项目,但是如果“title”字符串值已经在列表中,我只想增加计数,而不是插入重复的项目Scala 如果项目已经存在,如何增加内部列表中的计数器,scala,Scala,我的TitleStats案例类有一个内部列表。我想在列表中添加一个项目,但是如果“title”字符串值已经在列表中,我只想增加计数,而不是插入重复的项目 case class User(id: Int, name: String, title: String) case class Title(name: String, count: Int) val t1 = Title("sales", 0) val t2 = Title("support", 0) val titles = List(
case class User(id: Int, name: String, title: String)
case class Title(name: String, count: Int)
val t1 = Title("sales", 0)
val t2 = Title("support", 0)
val titles = List(t1, t2)
val u1 = User(1, "joe", "sales")
val u2 = User(2, "sam", "support")
val u3 = User(3, "john", "sales")
val stats = TitleStats(titles)
println(stats)
println(stats.addUser(u1))
case class TitleStats(titles: List[Title]) {
def addUser(u: User): List[Title] = {
Title(u.title, 1) :: titles
}
}
如果添加的用户已经在列表中,我如何更新方法addUser
,以增加标题的计数器。否则,只是像当前一样增加它
我不知道如何在没有任何可变状态的情况下进行跟踪
您可以这样做:
(注意,groupMapReduce来自Scala
2.13
)
是否需要保留插入顺序?这似乎是一个很好的地图用例。不,顺序可以改变。
final case class User(id: Int, name: String, title: String)
type Titles = Map[String, Int]
final case class TitleStats private (titles: Titles) {
def addUser(user: User): TitleStats =
copy(
titles = this.titles + (
user.title -> (
1 + this.titles.getOrElse(
key = user.title,
default = 0
)
)
)
)
}
object TitleStats {
def apply(users: User*): TitleStats =
new TitleStats(titles = users.groupMapReduce(_.title)(_ => 1)(_ + _))
}
val u1 = User(1, "joe", "sales")
val u2 = User(2, "sam", "support")
val u3 = User(3, "john", "sales")
TitleStats(u1, u2).addUser(u3)
// res: TitleStats = TitleStats(Map("support" -> 1, "sales" -> 2))