无法为函数写入映射
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]]
,使用起来有点笨拙。使用 flatMap
和 case 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')))
我有这样的数据:
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]]
,使用起来有点笨拙。使用 flatMap
和 case 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')))