Scala:如何附加到Seq

时间:2018-03-28 09:26:37

标签: 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 -> names)
}

当我打电话给"添加"方法,如下:

add(2, "Mike")
add(2, "Michelle")
add(2, "John")

我希望grades(2, Seq(Mike, Michelle, John)),但相反,它只包含最后一个(2, John)

我该如何解决?

感谢!!!

2 个答案:

答案 0 :(得分:2)

如果你想以更多的Scala方式(没有副作用,纯功能)做同样的事情,请看一下:

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")

答案 1 :(得分:0)

对我来说很好。我唯一提到的是add期望Int, String,你将其称为add(2, "Mike")(即Int, String) - 这将无法编译。这是我的Scala控制台的输出(在调用add方法后翻转输入变量的顺序):

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))

我不确定为什么它不适合你。如果你像我最初想的那样得到前两个输入错误的方式,即add(2, "Mike")等,你会期望输出为(2, List(John))而不仅仅是(2, John)。我认为你在那里违反了斯卡拉的法律。

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