【问题标题】:How to use Scala Stack for a postfix arithmetic calculation?如何使用 Scala Stack 进行后缀算术计算?
【发布时间】:2015-06-30 18:03:46
【问题描述】:

我编写了一个算法来获取中缀语句,将其更改为后缀,现在我想对该语句执行计算。我见过this as a sample,但我不明白它的某些部分会发生什么。它正在使用 Scala Stack。

  1. 这部分是如何工作的:

     case x :: y :: xs => xs ++ List(op(y, x))
    
  2. 我在计算中使用的类型是整数和 RDD,所以在本例中,如果我将“Float”替换为“Any”,对吗?

【问题讨论】:

  • 如果你不明白那行在做什么,我怀疑你根本不明白 scala 的 match 语句是做什么的。查看docs.scala-lang.org/tutorials/tour/pattern-matching.htmltutorialspoint.com/scala/scala_pattern_matching.htm 之类的教程,然后再返回。
  • @soong 谢谢我理解匹配我的问题是语法“x::y::xs”
  • ::List 的特殊语法,表示附加到列表。因此,总体而言,“我可以将其解构为一个包含两个项目和一个余数(可以为空)的列表吗?如果是这样,这些项目是xy,其余的是xs'
  • 谢谢宋,这是我对第一个问题的回答!
  • 关于第 2 部分,我对 RDD 不太熟悉,但是从查看 API 来看,我有点困惑。它们是RDD[Int] 类型吗? RDD 对象有基本的算术运算吗?我没有看到它们,但也许我不是在寻找相关的隐式转换。

标签: scala stack rdd


【解决方案1】:

将我的评论移到答案中,然后尝试回答第 2 部分:

:: 是带有 List(以及其他集合)的特殊语法,表示附加到现有列表。有问题的模式(在包含match 的上下文中)是匹配具有两个元素(将分别存储在xy 中)和余数(可以为空或@987654327)的列表@ 并存储在xs)。

至于第二个问题,我有点困惑你将如何将项目解析为 RDD,但我建议你制作一种可以封装整数或一个RDD。这样一来,您就不会因为您将其声明为 Any 而尝试传递完全不相关的值而出现任何错误。

编辑:根据您的评论,我会推荐如下内容:

expressions match {
    case x: RDD :: y: RDD :: xs => {//do what you want with two RDDs here}
    case x: RDD :: y: Int :: xs => {//do what you want with one of each here}
    case x: Int :: y: RDD :: xs => {//do what you want with one of each in the other order here}
    case x: Int :: y: Int :: xs => {//do what you want with two Ints here}
}

【讨论】:

  • 我已经为 RDD 计算实现了“+ - / *”,我的 RDD 是: RDD[(Int,Array[Float])] 现在我需要做的是,当我检查时列表中是否有两个项目执行操作以及它们是RDD和float,RDD和RDD,还是Float和Float,然后为它们调用我的覆盖+ - * /并将结果推回堆栈
  • 更新了答案以反映这一点。
  • 非常感谢,这是一个很好的提示,让我知道如何处理它!
  • 我在该程序中有另一个问题(又是语法),如果您认为需要,我可以创建一个新问题。我想知道 expr 和 reduce 函数中的“op”它是如何工作的,它从哪里得到当前的运算符?
  • 这是一个来自 scala.util.parsing.combinator.ImplicitConversions.scala 的隐式函数。您可以在bitwalker.org/blog/2013/08/10/… 找到更多关于它们的信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
相关资源
最近更新 更多