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

scala – 如何转换某些数组元素的功能方法?

发布时间:2020-12-16 08:50:53 所属栏目:安全 来源:网络整理
导读:我有一个带有复选框的项目列表的 Scala应用程序,以便用户选择一些,然后单击按钮将它们向上移动一个位置(左).我决定编写一个函数来移动满足给定谓词的任意类型的元素.所以,如果你有这些元素: a b c D E f g h I 并且谓词是“大写字符”,该函数将返回: a b D
我有一个带有复选框的项目列表的 Scala应用程序,以便用户选择一些,然后单击按钮将它们向上移动一个位置(左).我决定编写一个函数来移动满足给定谓词的任意类型的元素.所以,如果你有这些元素:

a b c D E f g h I

并且谓词是“大写字符”,该函数将返回:

a b D E c f g I h

简而言之,符合谓词的任何连续元素序列都与其左侧的单个元素交换.

我提出了以下丑陋的命令式实现.我希望看到一个很好的,希望可读的功能解决方案.

def shiftUp[T](a:Array[T],shiftable: T => Boolean) = {
    val s = new Array[T](a.length)
    var i = 0
    var j = 0
    while(i < a.length)
    {
        if(!shiftable(a(i)) && i < a.length - 1 && shiftable(a(i+1)))
        {
            var ii = i + 1
            while(ii < a.length && shiftable(a(ii)))
            {
                s(j) = a(ii)
                ii = ii+1
                j = j+1
            }
            s(j) = a(i)
            i = ii
        }
        else
        {
            s(j) = a(i)
            i = i+1
        }
        j = j+1
    }
    s
}

编辑:谢谢大家,我希望你喜欢这个练习!

解决方法

这是一个纯粹的功能实现

def shiftElements[A](l: List[A],pred: A => Boolean): List[A] = {
  def aux(lx: List[A],accum: List[A]): List[A] = {
    lx match {
      case Nil => accum
      case a::b::xs if pred(b) && !pred(a) => aux(a::xs,b::accum)
      case x::xs => aux(xs,x::accum)
    }
  }
  aux(l,Nil).reverse
}

而这里使用内部的可变性更快

import scala.collection.mutable.ListBuffer
def shiftElements2[A](l: List[A],pred: A => Boolean): List[A] = {
  val buf = new ListBuffer[A]
  def aux(lx: List[A]) {
    lx match {
      case Nil => ()
      case a::b::xs if pred(b) && !pred(a) => {
        buf.append(b)
        aux(a::xs)
      }
      case x::xs => {
        buf.append(x)
        aux(xs)
      }
    }
  }
  aux(l)
  buf.toList
}

(编辑:李大同)

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

    推荐文章
      热点阅读