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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |