scala – 改变列表并返回删除内容的正确(功能)方法是什么?
发布时间:2020-12-16 18:04:28 所属栏目:安全 来源:网络整理
导读:我正在尝试学习 scala,并决定创建一个扑克应用程序,让我的头围绕一些类对象.我的甲板工作正常,但我已经到了需要画5张牌的地步.到目前为止,我有: import util.Randomcase class Card(value: Int,color: String)class Deck { private var deck = newDeck def
我正在尝试学习
scala,并决定创建一个扑克应用程序,让我的头围绕一些类对象.我的甲板工作正常,但我已经到了需要画5张牌的地步.到目前为止,我有:
import util.Random case class Card(value: Int,color: String) class Deck { private var deck = newDeck def draw(amount: Int): List[Card] = { val ret = deck.take(amount) deck = deck.drop(amount) ret } def newDeck: List[Card] = { Random.shuffle((1 to 13).map(x => List(Card(x,"D"),Card(x,"C"),"H"),"S"))).toList.flatten) } override def toString: String = "Deck has " + deck.length + " cards left." } 这个绘图功能看起来似乎没有两个步骤 – 但是我不确定我是否能够(或者应该)拿到顶部多个卡片,并将列表保留在没有这些卡片的状态下? (顺便说一句,如果某人有更好的甲板创建/洗牌功能,我会全力以赴,这看起来有点像hacky ……但我的主要问题是列表状态) 解决方法
在我看来,你应该重写代码:
(a)具有完全不可变的结构,即NO var,NO可变集合 要么 (b)替换var deck:通过一些可变集合列出[Card],如ListBuffer. 这是(a)解决方案: import util.Random case class Card(value: Int,color: String) class Deck(private val cards: Seq[Card]) { def draw(amount: Int): (Deck,Seq[Card]) = { val (ret,rem) = cards.splitAt(amount) (new Deck(rem),ret) } override def toString: String = "Deck has " + cards.size + " cards left." } object Deck { def apply(cards: Seq[Card] = Nil): Deck = cards match { case Nil => val ncds = for(v <- 1 to 13; c <- Seq("D","C","H","S")) yield Card(v,c) new Deck(Random.shuffle(ncds)) case _ => new Deck(cards) } } 使用案例: scala> :paste // Entering paste mode (ctrl-D to finish) //paste code here // Exiting paste mode,now interpreting. import util.Random defined class Card defined class Deck defined object Deck scala> val d1 = Deck() d1: Deck = Deck has 52 cards left. scala> val (d2,cards) = d1.draw(4) d2: Deck = Deck has 48 cards left. cards: Seq[Card] = Vector(Card(3,H),Card(2,S),Card(11,Card(8,C)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |