无法为函数编写映射

时间:2016-10-25 04:57:41

标签: scala map-function

我有这样的数据:

val timeArr = Array("09:00:00|09:30:00", "10:00:00|11:00:00", "12:00:00|15:00:00","10:00:01|13:23:55")

我希望以下列方式输出

(‘09:00:00’, ‘S’)
(‘09:30:00’, ‘E’)
(‘10:00:00’, ‘S’)
(‘10:00:01’, ‘S’)
(‘11:00:00’, ‘E’)
(‘12:00:00’, ‘S’)
(‘13:23:55’, ‘E’)
(‘15:00:00’, ‘E’)

开始时间为S,结束时间为E

我尝试了使用map的各种方式,但它没有用。

4 个答案:

答案 0 :(得分:4)

建立@mfirry答案我觉得这给了你想要的东西。

split("|")会产生一个Array[Array[String]],这有点笨拙。使用flatMapcase Array(a, b, _*)使得处理内部数组更容易获得所需的输出。最后,您对元组的第一个元素(时间)进行排序。

scala> timeArr.map(_.split("\\|")).flatMap { case Array(a, b, _*) => Array((a, 'S'), (b, 'E'))}.sortBy(t => t._1)

res150: Array[(String, Char)] = 
 Array(
   (09:00:00,S),
   (09:30:00,E),
   (10:00:00,S),
   (10:00:01,S),
   (11:00:00,E),
   (12:00:00,S),
   (13:23:55,E),
   (15:00:00,E)
 )

答案 1 :(得分:3)

这应该有效:

self.startAnimation(index: 0)

或一个有趣的单行:

for { a <- timeArr.map(_.split("\\|")) b <- a.zipWithIndex.map{ case (e, i) => if(i == 0) { (e,'S') } else (e, 'E') } } yield b

答案 2 :(得分:1)

作为&#34; code golf&#34;挑战,我想知道我能做多么短暂。

timeArr.flatMap(x => Array((x take 8, 'S'), (x drop 9, 'E')))

答案 3 :(得分:0)

首先,你需要创建一个地图来创建元组(开始,结束),然后你想要的是创建一个flatMap。

尝试这样的事情:

val result = timeArr.map(_.split("\\|"))
  .flatMap(t => (t(0), 'S') :: (t(1), 'E') :: Nil)

一些解释:

map(_.split("\\|")

这会将字符串拆分为String of Array,因此原始集合的每个元素现在都有一个String数组。

所以...现在你有一个阵列数组......但你需要一个简单的数组。对于这种类型的问题是当你需要使用flatMap时:

flatMap(t => (t(0), 'S') :: (t(1), 'E') :: Nil)