2017-02-03 5 views
1

私は自分のツリーのノードに対していくつかのInt値を格納するMapを定義しました。ScalaのMapキーとしてオブジェクトのアドレスを使用

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) 

私はへの参照を見て期待していたNodeクラスは次のように定義されますマップにキーとして格納しているNodeオブジェクトのアドレス(またはそのアドレス)を返します。私の前提は依然として有効で、printメソッドは印刷中にオブジェクトをシリアライズしています。これが真でない場合は、型のマップ(referenceTo(Node) - > int int value)を作成するにはどうすればよいですか。

+0

だから、あなたはIdentityHashMapのようなものが欲しいですか? https://docs.oracle.com/javase/7/docs/api/java/util/IdentityHashMap.html Scalaにも対応しています。 – Sid

+0

あなたは正確に何をしようとしていますか?ケースクラスを印刷すると、その表現が印刷されます。マップ値が必要な場合は、同じ構造を持つ新しいNodeクラスを作成してください。 –

+0

そのツリーの作成に使用したコードを追加してください。 – nmat

答えて

1

hashcodeとequalsをオーバーライドして、参照に基づいて試してみてください。スカラー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 
    } 
    } 
+0

ありがとうSumeet、これは私が探していたものです。 – devj

関連する問題