0

我试图将二十一点游戏的基本策略表示为具有整数键的地图,其值是固定长度的字符串数组。键代表玩家手牌的值,数组索引代表庄家上牌的值(因此大小为 10 的固定长度数组对应于牌值 2-11)。数组中对应庄家上牌位置的字符串值包含了理想的玩法(留、打、分、加倍)。

IE) 玩家手牌值是硬 8,庄家上牌是 2。基本策略说玩家应该击中。为了使用我的地图来确定这一点,我将获取键为 8 的数组(玩家手牌值 = 8),然后查看数组索引 0 中的字符串(庄家牌 = 2)。

我试图这样定义它:

val hardHandBasicStrategy = collection.mutable.Map[Int,Array[String](10)]

但 Scala 似乎不喜欢这样......

请帮助我了解我做错了什么,和/或提出一种使它起作用的方法。

4

1 回答 1

2

Scala 没有表示固定大小数组的类型。你可以简单地使用大小为 10 的数组——这是通常所做的——或者,如果你想要更强有力地保证它确实是大小为 10,你可以自己构造一个十长数组类:

class ArrayTen[T: ClassManifest](zero: T) {
  protected val data = Array.fill(10)(zero)
  def apply(i: Int) = data(i)
  def update(i: Int, t: T) { data(i) = t }
  protected def set(ts: Array[T]) { for (i <- data.indices) data(i) = ts(i) }
  def map[U: ClassManifest](f: T => U) = { 
    val at = new ArrayTen(null.asInstanceOf[U])
    at.set(data.map(f))
    at
  }
  def foreach(f: T => Unit) { data.map(f) }
  override def toString = data.mkString("#10[",",","]")
  override def hashCode = scala.util.MurmurHash.arrayHash(data)
  override def equals(a: Any) = a match {
    case a: ArrayTen[_] => (data,a.data).zipped.forall(_ == _)
    case _ => false
  }
  // Add other methods here if you really need them
}

例子:

scala> new ArrayTen("(nothing)")
res1: ArrayTen[java.lang.String] = 
  #10[(nothing),(nothing),(nothing),(nothing),(nothing),
  (nothing),(nothing),(nothing),(nothing),(nothing)]

scala> res1(3) = "something!!!"

scala> res1
res3: ArrayTen[java.lang.String] = 
  #10[(nothing),(nothing),(nothing),something!!!,(nothing),
  (nothing),(nothing),(nothing),(nothing),(nothing)]

如果您需要固定长度的数组来获取确定长度的参数,那么您应该

trait Size { size: Int }
class ArraySize[S <: Size, T: ClassManifest](zero: T, s: Size) {
  protected val data = Array.fill(s.size)(zero)
  ...
}

除非您重新实现它们,否则您不会拥有所有集合的好东西,但是您又不想要大多数好东西,因为它们中的大多数都可以更改数组的长度。

于 2012-10-04T21:06:54.387 回答