scala - 算法混合

标签 scala traits

我有一个扩展 Iterator 并对复杂算法建模的类 (MyAlgorithm1)。这样,算法就可以通过Next方法逐步推进。

class MyAlgorithm1(val c:Set) extends Iterator[Step] {
   override def next():Step {
       /* ... */
   }
   /* ... */
}

现在我想在第一个算法的每次传递中应用不同的算法 (MyAlgorithm2)。应该插入算法1和2的迭代

class MyAlgorithm2(val c:Set) { /* ... */ }

我怎样才能以最好的方式做到这一点?也许有一些特质?

更新:

MyAlgorithm2 接收一个集合并对其进行转换。 MyAlgorithm1 也是,但是这个比较复杂,需要一步步运行。这个想法是运行 MyAlgoirthm1 的一步,然后运行 ​​MyAlgorithm2。下一步相同。实际上,MyAlgorithm2 简化了集合,可能有助于简化 MyAlgorithm1 的工作。

最佳答案

如前所述,问题可以通过继承或特征来解决。例如:

class MyAlgorithm1(val c:Set) extends Iterator[Step] {
  protected var current = Step(c)
  override def next():Step = {
    current = process(current)
    current 
  }
  override def hasNext: Boolean = !current.set.isEmpty
  private def process(s: Step): Step = s
}

class MyAlgorithm2(c: Set) extends MyAlgorithm1(c) {
  override def next(): Step = {
    super.next()
    current = process(current)
    current
  }
  private def process(s: Step): Step = s
}

有了 traits,您可以使用 abstract override 做一些事情,但是设计它以便将简化的结果提供给第一个算法可能会更难。

但是,我建议您以错误的方式解决问题。

您可以这样定义您的算法,而不是为扩展迭代器的算法创建类:

class MyAlgorithm1 extends Function1[Step, Step] {
  def apply(s: Step): Step = s
}

class MyAlgorithm2 extends Function1[Step, Step] {
  def apply(s: Step): Step = s
}

然后可以更容易地定义迭代器:

Iterator.iterate(Step(set))(MyAlgorithm1 andThen MyAlgorithm2).takeWhile(_.set.nonEmpty)

关于scala - 算法混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3128119/

相关文章:

匹配 Java 接口(interface)时的 Scala match/case 语句

scala - 如何制作也可以以非尾递归方式引用自身的尾递归方法

c++ traits 设计中的习语

Function0 上的 Scala 堆栈修改

Rust:条件特征继承

java - 找不到 Scala 扩展特征字段

scala - `:_*`(冒号下划线星号)在 Scala 中起什么作用?

Scala Multiple Future 包含在 Try 中

c# - 有没有等同于 petapoco 的 Scala?

generics - 为什么 Box<T> 的特征实现与 Fn() 冲突?