Scala:如何向Seq追加元素

3
我正在苦恼以下代码段:
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")

我期望grades应该是(2, Seq(Mike, Michelle, John)),但是实际上只包含了最后一个添加的(2, John)
我该怎么解决呢?
谢谢!

1
它对我来说完美无缺。此外,您的添加方法是(String,Int),而您正在通过add(Int,String)进行调用。scala> add("Mike", 2) scala> grades res2:DB = Map(2-> List(Mike)) scala> add("Michelle", 2) scala> grades res4:DB = Map(2-> List(Michelle,Mike)) - NOLFXceptMe
2个回答

4

如果你想用更加 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")

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)。我认为你在这里违反了 Scala 的规则。

作为一种“最佳实践”,尽可能避免使用 var 会更好。这可以通过不可变变量进行重写。alvinalexander 有一篇很好的文章解释了不可变变量的优先级。值得一读。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接