无法为函数写入映射

Unable to write map for the 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 的方法,但都没有用。

这应该有效:

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

或一个有趣的单行:

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

首先你需要创建一个映射来创建元组(开始,结束),然后你错过的是创建一个 flatMap。

尝试这样的事情:

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

一些解释:

map(_.split("\|")

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

所以...现在您有一个数组的数组...但您需要一个简单的数组。对于这类问题是需要使用flatMap的时候:

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

基于@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)
 )

作为一个“code golf”挑战,我想看看我能做到多短。

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