簡體   English   中英

如何定義其值包含String類型的固定長度數組的映射?

[英]How can I define a map whose values contain a fixed length array of type String?

我試圖將二十一點游戲的基本策略表示為具有整數鍵的映射,其值是固定長度的字符串數組。 鍵代表玩家手牌的價值,陣列索引代表經銷商牌的價值(因此大小為10的固定長度陣列對應於牌值2-11)。 對應於經銷商的向上牌的位置中的數組中的字符串值包含理想的游戲(停留,命中,分割,雙重)。

IE)玩家手牌值很難8,經銷商牌是2。基本策略說玩家應該打。 要使用我的地圖確定這一點,我將獲得其鍵為8(玩家手牌值= 8)的數組,然后查看數組索引0中的字符串(Dealer up card = 2)。

我試圖用這種方式定義它:

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

但斯卡拉似乎不喜歡這個......

請幫助我理解我做錯了什么,並且/或者建議一種方法來使它工作。

Scala沒有表示固定大小的數組的類型。 您可以簡單地使用大小為十的數組 - 這是通常所做的 - 或者,如果您想要更強大的保證它實際上是十號,您可以自己構建一個十長數組類:

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)
  ...
}

你不會有所有集合好吃的東西,除非你重新實現它們,但話又說回來,你不希望大部分的好吃的東西,因為他們大多數可以改變數組的長度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM