scala – 如何根据prev和curr元素的条件拆分迭代器?
发布时间:2020-12-16 18:16:52 所属栏目:安全 来源:网络整理
导读:我想将一个元素列表拆分成一个列表列表,以便内部列表中的相邻元素满足给定条件. 一个简单的条件是相邻元素是相等的.然后如果输入是List(1,1,2,3,3),则输出为List(List(1,1),List(2,2),List(3,3)). 另一个条件可能是当前元素应该大于prev元素.然后如果输入是L
我想将一个元素列表拆分成一个列表列表,以便内部列表中的相邻元素满足给定条件.
一个简单的条件是相邻元素是相等的.然后如果输入是List(1,1,2,3,3),则输出为List(List(1,1),List(2,2),List(3,3)). 另一个条件可能是当前元素应该大于prev元素.然后如果输入是List(1,4,6,5,7,8),List(1,6),List (5,8)).如果该方法可以作用于Iterator,那也是很棒的.方法的typedef是 def method[A](lst:List[A],cond:(A,A)=>Boolean):List[List[A]] def method[A](lst:Iterator[A],A)=>Boolean):Iterator[Iterator[A]] 解决方法
您可以在递归函数中使用与span一起滑动以获得所需效果.这种快速而肮脏的版本效率较低,但比其他选择更为简洁:
def method[A](lst: TraversableOnce[A],cond: (A,A) => Boolean): List[List[A]] = { val iterable = lst.toIterable iterable.headOption.toList.flatMap { head => val (next,rest) = iterable.sliding(2).filter(_.size == 2).span(x => cond(x.head,x.last)) (head :: next.toList.map(_.last)) :: method(rest.map(_.last),cond) } } 如果你想懒惰地执行代码,你可以返回Iterator [List [A]]而不是List [List [A]]: def method[A](lst: TraversableOnce[A],A) => Boolean): Iterator[List[A]] = { val iterable = lst.toIterable iterable.headOption.toIterator.flatMap { head => val (next,x.last)) Iterator(head :: next.toList.map(_.last)) ++ method(rest.map(_.last),cond) } } 你可以验证这是懒惰的: val x = (Iterator.range(0,10) ++ Iterator.range(3,5) ++ Iterator.range(1,3)).map(x => { println(x); x }) val iter = method(x,(x: Int,y: Int) => x < y) //Only prints 0-9,and then 3! iter.take(2).toList //Prints more iter.toList //Prints the rest 你可以通过返回迭代器[迭代器[A]]使它变得更加懒惰: def method[A](lst: TraversableOnce[A],A) => Boolean): Iterator[Iterator[A]] = { val iterable = lst.toIterable iterable.headOption.toIterator.flatMap { head => val (next,x.last)) Iterator(Iterator(head) ++ next.toIterator.map(_.last)) ++ method(rest.map(_.last),cond) } } 作为一个相对不相关的旁注,当你有这个表格的通用参数时,你最好使用2个参数列表: def method[A](lst: TraversableOnce[A])(cond: (A,A) => Boolean) 当你有这样的2个参数列表时,类型推断可以更聪明一些: //No need to specify parameter types on the anonymous function now! method(List(1,8,1))((x,y) => x < y).toList //You can now even use underscore anonymous function notation! method(List(1,8))(_ < _) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Scala类参数化中附加冒号的含义
- angular2 – 用角度2处理全球401
- angularjs – Ionic – 如何在登录页面上删除sidemenu?
- 1.8、Bootstrap V4自学之路------起步---易用性
- vim – 如何使用nerdtree创建目录
- Angular UI Bootstrap popover与关闭按钮
- linux – 永远“重启(1)”中的Docker私有注册表状态
- angular – OnScroll事件Ionic 2
- angularjs – 具有jsonp有效负载的Express.js响应状态代码
- Angular pre-bootstrap(第一个屏幕)加载器的动画在初始加载