Scala:如何附加到Seq

Scala:如何附加到Seq,scala,append,seq,Scala,Append,Seq,我正在努力处理以下代码: type DB = Map[Int, Seq[String]] var grades: DB = Map.empty def add(name: String, grade: Int) = { var names: Seq[String] = Seq(name) if(grades isDefinedAt grade) { names = names ++ grades(grade) } grades += (grade -> name

我正在努力处理以下代码:

type DB = Map[Int, Seq[String]]
var grades: DB = Map.empty
def add(name: String, grade: Int) = {
  var names: Seq[String] = Seq(name)
  if(grades isDefinedAt grade) {
    names = names ++ grades(grade)
  }
    grades += (grade -> names)
}
当我调用“add”方法时,如下所示:

add(2, "Mike")
add(2, "Michelle")
add(2, "John")
我希望
成绩
(2,Seq(Mike,Michelle,John))
,但它只包含最后添加的
(2,John)

我怎样才能解决这个问题


谢谢

如果您想以更具规模的方式(无副作用,纯功能性)进行同样的操作,请查看以下内容:

type DB = Map[Int, Seq[String]]

def add(db: DB, name: String, grade: Int): DB = {
  db.get(grade) match {
    case Some(seq) => // key exists, let's update the value
      val newSeq = seq :+ name  // create new sequence
      db.updated(grade, newSeq)
    case None =>      // key does not exist, let's add new key
      db + (grade -> Seq(name))
  }
}

val db: DB = Map.empty

val db1 = add(db, name = "A", grade = 1)
println(s"db1: $db1")

val db2 = add(db1, name = "B", grade = 1)
println(s"db2: $db2")

val db3 = add(db2, name = "C", grade = 2)
println(s"db3: $db3")

对我来说很好。我要提到的唯一一件事是,
add
需要
Int,String
,您将其称为
add(2,“Mike”)
(即
Int,String
)-这不会编译。下面是我的Scala控制台的输出(在调用
add
方法时翻转输入变量的顺序之后):

我不知道为什么它对你不起作用。如果您像我最初认为的那样,以错误的方式获得前两个输入,即
add(2,“Mike”)
等,那么您会期望输出是
(2,List(John))
,而不仅仅是
(2,John)
。我认为你违反了斯卡拉的法律


正如“最佳实践”一样,最好尽可能避免
var
。这可以在没有可变变量的情况下重写。有一篇好文章解释了对不可变变量的偏好。值得一读。

它对我非常有效。另外,您的add方法是(String,Int),而您通过add(Int,String)scala>add(“Mike”,2)scala>gradesres2:DB=Map(2->List(Mike))scala>add(“Michelle”,2)scala>gradesres4:DB=Map(2->List(Michelle,Mike))调用它
scala> type DB = Map[Int, Seq[String]]
defined type alias DB

scala> var grades: DB = Map.empty
grades: DB = Map()

scala> def add(name: String, grade: Int) = {
     |   var names: Seq[String] = Seq(name)
     |   if(grades isDefinedAt grade) {
     |     names = names ++ grades(grade)
     |   }
     |   grades += (grade -> names)
     | }
add: (grade: Int, name: String)Unit

scala> 

scala> add("Mike", 2)

scala> add("Michelle", 2)

scala> add("John", 2)

scala> grades
res3: DB = Map(2 -> List(John, Michelle, Mike))