加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读