5

ID セットを作成する簡単な方法を探しています。グラフをたどっているときに特定のオブジェクトを「見た」かどうかを追跡できるようにしたいだけです。

Set は "==" (Scala の equals メソッド) を使用して要素を比較するため、通常の Set は使用できません。私が欲しいのは、「eq」を使用するセットです。

セット要素で equals を呼び出すのではなく、等価性をテストするためのアプリケーション指定のメソッドを使用する Set を Scala で作成する方法はありますか? オーバーライドできるある種の「wrapEquals」メソッドを探しましたが、見つかりませんでした。

Java の IdentityHashMap を使用できることはわかっていますが、もっと汎用的なものを探しています。

私が持っていた別のアイデアは、eq に関して equals を実装する別のオブジェクトで各セット要素をラップすることでしたが、新しい equals 実装を取得するためだけに大量の新しいオブジェクトを生成するのは無駄です。

ありがとう!

4

3 に答える 3

3

必要に応じて、次のような含まれる要素に対して ID チェックを使用するボックスを作成できます。

class IdentBox[T <: AnyRef](val value: T) {

    override def equals(other: Any): Boolean = other match {
      case that: IdentBox[T] => that.value eq this.value
      case _ => false
    }

    override def hashCode(): Int = value.hashCode

  }

そして、要素を直接ではなく、これらのボックスを含むコレクションを作成します: Set[IdentBox[T]]

ボックス化/ボックス化解除のオーバーヘッドがありますが、ユースケースでは許容できる場合があります。

于 2016-11-28T21:34:07.360 に答える
1

これは同様の質問です。その場合の受け入れられた答えは、を使用しTreeSetてカスタムを提供することでしたComparator

于 2010-04-18T15:09:33.897 に答える
-1

「seen」オブジェクトへの参照は必要ありませんが、「contains」のブール値だけが必要なので、aを使用して、mutable.Set[Int]を呼び出して取得した値をロードすることをお勧めしますSystem.identityHashCode(obj)

Scalaカスタムコレクションには、このような簡単な調整を必要とするほとんどの人を怖がらせるのに十分な概念的な表面積があります。

于 2010-04-19T07:51:45.067 に答える