2016-06-23 14 views
0

Mapcase classというオブジェクトに維持したいので、新しいインスタンスを追加してIDでそれらを探すことができます。Scalaでケースクラスオブジェクトのマップを維持する

私の現在の(非常に醜い)溶液(ストリップダウン):

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 
} 

そして他の場所で、私はaddccを追加私のccオブジェクトのMapを維持するために、例えば、val somecc = addcc(cc(56))を使用することができます。

このようにして、私はファイルにいくつかのデータを含むhashCodeだけのキーを格納し、ファイルを読むと、hashCodeを参照してccオブジェクトを抽出することができますmyccmapには存在しません)。

これを行うには、nullのチェックに頼らないのが理想的ですか?

+0

私は空のマップを作成するために 'Map()'を使用できることを発見しました。これにより、「ヌル」のチェックが不要になります。誰かがもっと良い解決策を持っている場合に備えて... – spiffman

+0

空のMapを作るのに 'Map.empty'を使うべきでしょう。 –

+2

それは他の理由のために悪い考えです:1)異なるオブジェクトは同じハッシュコードを持つことができるので、あなたはちょうどこのような2つのオブジェクトを持って起こる、あなたは本当に奇妙なエラーに終わるでしょう。 2)ハッシュコードは、プログラム実行の間に安定することは保証されていません。 –

答えて

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

本当にそのようにしたいかどうかによって異なります。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 
} 
関連する問題