Scala 如何从自定义类型启动空变量?

Scala 如何从自定义类型启动空变量?,scala,Scala,我有一个包含自定义类型的类;我的目标是在这个“DB”中增加新的学生 我还创建了一个同伴对象来跟踪我的学生 object School { // val records: DB = ??? } 但是如何在我的对象上启动一个空的“DB”类型?如果键已经存在,您可以修改添加值的逻辑 请试试这个: class School { def add(name: String, g: Int): records.type = { School.records += (g -> Li

我有一个包含自定义类型的类;我的目标是在这个“DB”中增加新的学生

我还创建了一个同伴对象来跟踪我的学生

object School {
    // val records: DB = ???
}

但是如何在我的
对象上启动一个空的“DB”类型?

如果键已经存在,您可以修改添加值的逻辑

请试试这个:

class School {

  def add(name: String, g: Int): records.type = {
    School.records += (g -> List(name))
  }
}

object School {
  val records: mutable.Map[Int, List[String]] = mutable.Map()

  def apply(): School = new School()
}

object Demo extends App {

  School().add("String", 1)
  School().add("String1", 2)
  School().add("String2", 3)
  School().add("String3", 2)
  School().add("String4", 1)

  print(School.records) // output: Map(2 -> List(String3), 1 -> List(String4), 3 -> List(String2))
}
如果键已存在,则添加具有逻辑的方法:

  def add(name: String, g: Int): records.type = {
    School.records.isDefinedAt(g) match {
      case true => School.records += (g -> (School.records.getOrElse(g, List("")) ::: List(name)))

      case false => School.records += (g -> List(name))
    }
  }

//output for this add method Map(2 -> List(String1, String3), 1 -> List(String, String4), 3 -> List(String2))

如果不需要DB来包含类型参数(例如,后面的代码可以推断类型本身,这是最常见的情况),则可以使用集合伴随对象本身(它是
工厂

如果需要DB包含类型参数,则需要创建一个
Builder

val DB = Map.newBuilder[Int, Seq[String]]
def add(name: String, g: Int) = DB.addOne(g -> Seq(name)).result() //Prior 2.13, please use `+=`
如果您不喜欢Builder,可以使用更详细的强制转换:

val DB = Map
type DB = Map[Int, Seq[String]]
def add(name: String, g: Int): DB = DB(g -> Seq(name)) //This ensures lower bound of covariant types

private var records=Map.empty[String,Seq[String]]
?是否要在学校的所有对象中共享一个变量?@RamanMishra是的,“DB”应该是一个“内存中”数据库。如何向同一个映射密钥添加多个名称?映射的“值”是一个seq,是否有一个
DB(g).append(name)
?@rafacioly在这种情况下,您需要使用可变seq(collection.mutable.seq)而不是常规的(不可变的),并使用我答案中的最后一个解决方案。然后您可以执行
DB(g).追加(名称)
val DB = Map.newBuilder[Int, Seq[String]]
def add(name: String, g: Int) = DB.addOne(g -> Seq(name)).result() //Prior 2.13, please use `+=`
val DB = Map
type DB = Map[Int, Seq[String]]
def add(name: String, g: Int): DB = DB(g -> Seq(name)) //This ensures lower bound of covariant types