scala – 改变列表并返回删除内容的正确(功能)方法是什么?

前端之家收集整理的这篇文章主要介绍了scala – 改变列表并返回删除内容的正确(功能)方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试学习 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))

猜你在找的Scala相关文章