Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如果项目已经存在,如何增加内部列表中的计数器_Scala - Fatal编程技术网

Scala 如果项目已经存在,如何增加内部列表中的计数器

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(

我的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(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))