在Scala中使用对象的地址作为Map键

时间:2017-02-03 03:03:16

标签: java scala

我已经定义了一个Map来存储我树的节点的一些Int值。 Node类定义为:

case class Node(value: Int, var left: Node = null, var right: Node)

和地图

private val hMap = new mutable.HashMap[Node, Int]()

当我打印此地图时,我得到以下内容:

Map(Node(8,null,null) -> 1, Node(11,null,null) -> 1, Node(2,Node(3,null,null),Node(4,Node(5,null,Node(6,null,null)),null)) -> 4)

我希望看到我在Map中存储的Node对象的引用(或地址)。我的假设是否仍然有效,打印方法是在打印时序列化对象。如果不是这样,那么我该如何创建一个类型的Map(referenceTo(Node) - >某个int值)。

1 个答案:

答案 0 :(得分:1)

尝试覆盖hashcode,并等于基于引用。您可以使用scala eq运算符根据相等检查内的引用来匹配对象。

def main(args: Array[String]): Unit = {
    val hMap = new  mutable.HashMap[Node,Int]()
    val n1 = Node(1,null,null)
    val n3=new Node(3,null,null)
    val n2=new Node(2,n1,n3)
    hMap.put(n1,1)
    hMap.put(n2,2)
    hMap.put(n3,3)

    hMap foreach( println)

    println(hMap get new Node(1,null,null))

  }

  case class Node(value: Int, var left: Node = null, var right: Node) {
    override def equals(obj: scala.Any): Boolean = {
      if (obj.isInstanceOf[Node]) {
        val tmp = obj.asInstanceOf[Node]
        (tmp.value == this.value)
        // add more conditions for equality
      }else false
    }
    override def hashCode(): Int = {
        this.value
    }
  }