2016-10-25 6 views
0

기능에 대한지도를 쓸 수 없습니다 : 나는 종료 시간에 대한 시작 시간 SE을 갖는 다음과 같은 방법으로나는이 같은 데이터가

(‘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’) 

내 출력을 원하는

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") 

을 .

map을 사용하여 다양한 방법을 시도했지만 작동하지 않았습니다.

+0

"배열에서 문자열을 분할하고 결과를 매핑하는 방법" 질문의 제목이 더 좋을까요? – Brian

답변

1

"code golf"도전 과제로, 나는 그것을 얼마나 짧게 만들 수 있는지보고 싶었습니다.

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

좋은 캐치! 시간 형식은 항상 hh : MM : ss;입니다.) –

+0

짧고 우아합니다! – Brian

+0

좋은 솔루션 나는 결코 그것을 생각하지 못했습니다. –

3

이 작동합니다 :

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')) }

+1

결과를 시간순으로 정렬하지 않지만 질문의 예제가 시간순으로 정렬 된 것으로 보입니다. –

+0

이 작품 덕분에 –

0

먼저 당신이 튜플 (끝 시작) 다음 무엇을 만들지도를 작성해야 FlatMap을 만드는 것입니다.

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

이것은 문자열의 배열로 문자열을 분할, 그래서 원래의 콜렉션의 각 요소는 이제 문자열의 배열을 가지고 :

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

일부 설명 :

이 같은 것을보십시오.

이제 배열 배열이 생겼으나 간단한 배열이 필요합니다. 이 유형의 문제는 flatMap을 사용해야하는 경우입니다.

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

덕분에 자세한 설명을하지만 평면지도 전체 결과를 flattening했다. 예상대로 터플을 얻지 못했습니다. –

+0

timeArr.map (_. split ("\\ |")) flatMap {case Array (a, b, _ *) => 배열 ((a, 'S'), (b, 'E'))} 트릭을 했어 –

+0

죄송합니다. 튜플 대신에 flatMap을 만들어서 편집하겠습니다. –

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) 
) 
+0

결과를 정렬하는 것이 잘못되었습니다. 니스 @ 브라이언 –