1

クラスCがあります:

class C (...) { ... }

これを使用して、効率的なマップのインデックスを作成したいと考えています。最も効率的なマップは配列です。そこで、コンパニオン オブジェクトに「グローバル」「静的」カウンターを追加して、各オブジェクトに一意の ID を付与します。

object C {
  var id_counter = 0
}

C のプライマリ コンストラクターでは、CI を作成するたびに、グローバル カウンターの値を記憶して増やしたいと考えています。
質問 1:どのようにそれを行う?

これで、C オブジェクトで id をインデックス配列への完全なハッシュとして使用できるようになりました。しかし、array は、特定の配列が C の ID によってインデックス付けされる map のような型情報を保持しません。

質問 2:型安全性を持たせることは可能ですか?

更新:
質問 2 の型の安全性は、2 つの関連しない int の混合を避けるために、マップのインデックスの型に関係します。もちろん、値は(型)セーフです..

質問 1 では、デフォルト コンストラクターで変数をインクリメントする方法を尋ねています。
伊:どこに置く?

id_counter += 1
4

3 に答える 3

1

問題はわかりません。私はおそらくカウンターをプライベートにするので、外部classでコーディングしobject Cて変更することはできません。varタイプのインクリメントIntは簡単です。

idCounter += 1

配列は、JVM配列(2.8以降)によって直接実装されるため、Scalaではタイプセーフです。

私はあなたの質問を本当に理解していないのではないかと思います...

アップデート:

おそらく、コンストラクターのカウンターをインクリメントします。

実際の完璧なハッシュ関数を作成することに関しては、あなたが本当に正しい方向に進んでいるとは思いません。(実際のキーが何であれ、マッピングを独自のコードにプッシュしただけです。)最小限または完全なハッシュ関数を作成するための手法を読む必要があります。

于 2010-05-09T14:27:09.107 に答える
1

質問 2 への回答:

case class C_Id(val asInt: Int)

object C {
  private var list: ArrayBuffer[C] 
  // resizable array in scala.collection.mutable
  // you can also use ArrayList

  def apply(id: C_Id) = list(id.asInt) // only accepts an id of C
  ...
}

class C (...) {
  // in constructor:
  list += this
}

質問1を編集するには:デフォルトのコンストラクターは、メソッドと他のコンストラクターの定義を除いて、型の本体です。

于 2010-05-09T22:01:56.787 に答える
0

C のデフォルト コンストラクターを非公開にして、コンパニオン オブジェクトにファクトリ メソッドを提供していただけませんか (カウンターの更新を簡単に処理できます)。

于 2010-05-14T12:28:39.583 に答える