在Scala中维护案例类对象的Map

时间:2016-06-23 23:23:14

标签: scala

我想维护Mapcase class个对象,以便我可以添加新实例并通过ID查找它们。

我当前(非常丑陋)的解决方案(剥离):

case class cc(i: Int)

var myccmap: Map[Int, cc] = null

def addcc(thecc: cc): cc = {
    if (myccmap == null) {
        myccmap = Map(thecc.hashCode, thecc)
    }
    else {
        myccmap = myccmap ++ Map(thecc.hashCode, thecc)
    }
    thecc
}

然后在其他地方,我可以使用val somecc = addcc(cc(56))来维护我Mapcc个对象添加addcc

这样,我可以将密钥(只是hashCode)与文件中的一些数据一起存储,然后当我读取文件时,我可以通过查找hashCode来提取cc对象(可能会或可能不会出现在myccmap)中。

有没有更好的方法来做到这一点,理想情况下不依赖于对null的检查?

2 个答案:

答案 0 :(得分:2)

您的代码可以简化,如果您想要使用散列,只需使用HashSet

import collection.immutable.HashSet

case class Cc(i: Int)

var myccmap: HashSet[Cc] = HashSet.empty

def addcc(thecc: Cc): thecc.type = {
  myccmap += thecc
  thecc
}    

此外,按照惯例,类应以大写字母开头。我还使用单例类型作为addcc的返回值,这样很清楚这个函数真的只返回它的参数

答案 1 :(得分:1)

取决于您是否真的想要key。我想仍然需要哈希码的密钥,因为你将密钥存储在某个地方。并且要注意,在大多数情况下不要使用var,相反,使用可变映射会有所帮助。

case class cc(i: Int)

val myccmap: mutable.Map[Int, cc] = mutable.Map.empty

def addcc(thecc: cc): cc = {
    myccmap += (thecc.hashCode -> thecc)
    thecc
}