-1

次のように、16 進グリッドに整数座標を使用しています。

object Cood
{ 
  val up = Cood(0, 2)
  val upRight = Cood(1, 1)
  val downRight = Cood(1, -1)
  val down = Cood(0, - 2)
  val downLeft = Cood(-1, -1)
  val upLeft = Cood(- 1, 1)    
  val dirns: List[Cood] = List[Cood](up, upRight, downRight, down, downLeft, upLeft) 
}
case class Cood(x: Int, y: Int)
{
  def +(operand: Cood): Cood = Cood(x + operand.x, y + operand.y)
  def -(operand: Cood): Cood = Cood(x - operand.x, y - operand.y)
  def *(operand: Int): Cood = Cood(x * operand, y * operand)
}

Hexs と Sides の両方に座標値があります。すべてのヘックスには 6 つの面がありますが、一部の面は 2 つのヘックスで共有されます。たとえば、Hex(2, 2) とその上の隣の Hex(2, 6) は Side(2, 4) を共有します。だから私はこのような集合演算を適用したい:

val hexCoods: Set[Cood] = ... some code
val sideCoods: Set[Cood] = hexCoods.flatMap(i => Cood.dirns.map(_ + i).toSet)

しかし、これを行うと、Cood は参照型として扱われ、重複した座標は取り除かれません。これを回避する方法はありますか?

4

1 に答える 1

1

試してみましたか?

scala> Set.empty + Cood(1,1) + Cood(1,2) + Cood(1,1)
res0: scala.collection.immutable.Set[Cood] = Set(Cood(1,1), Cood(1,2))

@sschaef がコメントで指摘したように、ケース クラスには自動的に生成されたメソッドequalshashCodeメソッドがあり、同一性を比較するだけでなく、構造的な等価性を実装します。これは、セットで重複を取得してはならないことを意味し、私のテストのセットには重複エントリがありませんでした.

于 2012-10-02T00:02:43.120 に答える