scala:日期列表到范围列表
我有这样的想法:scala:日期列表到范围列表,scala,Scala,我有这样的想法: case class Range(start: String, end: String) List("s1", "s2", "s3", "s4") 我想得到: List(Range("s1","s2"), Range("s2","s3"), Range("s3", "s4")) 当然,我可以使用基于java的经典解决方案,但我正在寻找更优雅的解决方案。这正是您所期望的 list.sliding(2).collect { case List(from, to) => R
case class Range(start: String, end: String)
List("s1", "s2", "s3", "s4")
我想得到:
List(Range("s1","s2"), Range("s2","s3"), Range("s3", "s4"))
当然,我可以使用基于java的经典解决方案,但我正在寻找更优雅的解决方案。这正是您所期望的
list.sliding(2).collect { case List(from, to) => Range(from, to) }.toList
res0: List[Range] = List(Range(s1,s2), Range(s2,s3), Range(s3,s4))
这是另一个选择
(list zip list.tail) map Range.tupled
下面是一个简单的解决方案,它可以在不考虑数据类型的情况下工作(您可以在以后映射到任何您想要的数据):
干杯!滑动是我要找的。谢谢大家!@Łukasz,
Range
是一个对象,而不是一个函数,Range.apply()
是重载的,因此在尝试获取它时存在歧义。tupled
。所有这一切你都是对的,但在这里,我使用的是OP定义的Range
case类,而不是scalaRange
,因此没有重载,一切都可以编译,我用repl测试了它。除非我遗漏了什么?也许是我的错,我应该提供更有意义的名字。无论如何,这个解决方案可以完成任务。错过了。我的不好。很好,但是您可以通过跳过右键来保存对l
的遍历。结果也是一样的。@jwvh酷,我没注意到drop(1)
实际上是一个tail
操作。预期结果包含Range
s,而不是元组。您好@ukasz,感谢您的观察,现在它更简洁了:l zip l.tail
我没有将它映射到一个范围,因为我只是想演示这个想法,但这很简单:scala>(l zip l.tail)map{t=>Range(t.\u 1,t.\u 2)}res25:List[Range]=List(Range(s1 s2),Range(s2,s3),Range(s3,s4))
CheersŁukasz,刚刚看到你把它添加到了你的答案中,很好地使用了元组,做得很好。干杯
scala> val l = List("s1", "s2", "s3", "s4")
l: List[String] = List(s1, s2, s3, s4)
scala> l.dropRight(1) zip l.drop(1)
res4: List[(String, String)] = List((s1,s2), (s2,s3), (s3,s4))