【问题标题】:How to get eliminate ++ in Scala如何在Scala中消除++
【发布时间】:2016-05-11 12:21:20
【问题描述】:

我在 scala 中编写了一个代码,但我想从中删除 ++。代码运行良好,但我尽量不使用 ++ 或任何内置函数或运算符(甚至不是 :::)。

创建一个 val 是否更好,或者有更好的方法。

这是该代码的示例。

def partitionAux[A](f: A => Boolean, lst: List[A], 
                       rslt: (List[A], List[A]) ):(List[A], List[A]) = {
  lst match {
    case Nil => return result
    case head :: rest => {
      if (f(head))
        return partitionHelper(f, rest, (result._1 ++ List[A](head), rslt._2))
      else ...

【问题讨论】:

  • 1.什么(partitionAux 应该做什么;提供样本输入和输出)? 2. 为什么(不想用++)?
  • 这是我正在做的练习的一部分。 partitionAux 是一个辅助方法,它应该通过检查其他函数是真还是假来将一个列表分成 2 个。
  • 如果要在奇数和偶数之间拆分列表,示例将是:List(0,1,3,4,6)) == (List(0,4,6), List( 1,3))
  • 所以您想使用:: 而不是++(或:::)?只需在递归函数中添加结果,然后在最后反转两个列表。 (即使你可以使用++,你也应该这样做,因为附加到列表是O(n),前置是O(1))。

标签: scala function operators


【解决方案1】:

鉴于您只有一个元素作为++ 的第二个参数,您可以自己实现它:

 def concat[A](lst: List[A], a: A): List[A] =
    lst match {
      case Nil => a :: Nil
      case head :: tail => head :: concat(tail, a)
    }

println(concat(1 :: 2 :: 3 :: 4 :: Nil, 100)) // 1 :: 2 :: 3 :: 4 :: 100

还考虑到您提到partitionAux 应该将列表一分为二,听起来您应该只使用head :: result._1,而不是result._1 ++ List[A](head),然后最后将列表反转。自己写反向函数很容易,比如:

@tailRec
def reverse[A](list: List[A], result: List[A] = Nil): List[A] = 
  list match {
    case Nil => result
    case head :: tail => reverse(tail, head :: result)
  }

附:而且你不需要在 scala 中输入 return 关键字。在你的情况下它不会做任何事情

【讨论】:

  • 不仅你不需要输入return,你也不应该。
猜你喜欢
  • 2015-07-04
  • 2013-04-07
  • 1970-01-01
  • 2023-03-19
  • 2019-10-29
  • 2023-04-06
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多