【问题标题】:push all elements of list to stack in scala将列表的所有元素推送到scala中的堆栈
【发布时间】:2017-03-27 11:32:20
【问题描述】:

scala 中是否可以将列表的元素压入堆栈?

我知道可以一次推送多个元素,例如

val stack = scala.collection.mutable.Stack[Int]()
stack.push(1,2,3,4)

但如果我有一个已定义的列表或其他集合,我就不能这样做

val l1 = List[Int](5,6,7)
stack.push(l1)

实现这一点的 scala 惯用方式是什么?

【问题讨论】:

  • 你想要一个可变堆栈还是不可变堆栈?如果是不可变的,那么为什么不直接使用List。要pop 一个元素,您只需访问head(假设您使用前置操作将元素List 中,即::

标签: scala


【解决方案1】:

你可以通过pushAll方法实现。

val stack = scala.collection.mutable.Stack[Int]()
val l1 = List[Int](5,6,7)
stack.pushAll(l1)

【讨论】:

    【解决方案2】:

    使用一些已知值创建堆栈

    val stack = scala.collection.mutable.Stack[Int](1,2,3,4)
    

    或者用一些集合初始化。

    val l = List(1,2,3,4)
    val stack = scala.collection.mutable.Stack[Int](l:_*)
    

    或者像@adamywy 推荐的那样使用 pushAll。

    val stack = scala.collection.mutable.Stack[Int]()
    
    val l = List(1,2,3,4)
    stack.pushAll(l)
    

    【讨论】:

      【解决方案3】:

      根据最新 (2.12.0) 规范,mutable.Stack 已弃用,建议改用 var List。请看Stackapi。

      (Since version 2.12.0) Stack is an inelegant and potentially 
      poorly-performing wrapper around List. Use a List assigned 
      to a var instead.
      

      因此,如果您想用可变列表替换 Stack,您的示例将如下所示

      var stack = List.empty[Int]
      val l1 = List[Int](5,6,7)
      stack = stack ++: l1
      

      【讨论】:

      • 实际上,如果您要推送到可变 Listhead 并从中弹出(我认为这是有道理的),那么相当于 pushAll() 将是:stack = l1.reverse ++: stack
      猜你喜欢
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 2020-11-19
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多