2016-06-20 2 views
4

키/값의 Seq를 Map으로 변환하고 싶습니다. 시퀀스의 첫 번째 요소는 예약되어 있으므로 쌍 목록은 1 위치에서 시작됩니다.지도의 목록 표현에서 스칼라의 실제지도로

질문 : 더 많은 기능을 사용하여이 기능을 구현할 수 있습니까?

def list2Map(plainMap:Seq[String]) = { 
    var map = Map[String, String]() 
    var idx = 1; 
    while(plainMap.size > idx) { 
    val key = plainMap(idx) 
    idx += 1 
    val value = plainMap(idx) 
    idx += 1 

    map = map + (key -> value) 
    } 

    map 
} 

assert(list2Map(Seq("reserved slot","key0","value0","key1","value1","key2","value2")) == Map(("key0"->"value0"),("key1"->"value1"),("key2"->"value2"))) 

나는 스칼라에 새로운 오전, 내가 컬렉션을 반복하는 다른 많은 방법이 있다는 것을 알고 있지만 나는 요소에서 시작, 반복 당 두 개의 요소를 읽을 수있는 foreach는 방법을 발견하지 않습니다 1.

추신 : 감사합니다. 나는 모든 사람들의 반응으로 많은 것을 배우고있다 !!

+1

은 무엇입니까 키를 뒤 커버 문제? – Dima

+0

@Dima 더 기능적인 방법으로이 함수를 구현할 수 있다면 질문입니다. 나는 그 질문을 갱신했다. – angelcervera

+0

샘플 입력과 예상 출력을 제공 할 수 있습니까? 간단한 예제 만 제공하면 답을 얻기에 충분한 세부 정보를 얻을 수 있습니다. –

답변

4

list.drop(1).grouped(2).map { x => x.head -> x.last }.toMap

+1

'grouped (2)'다음에'.filter (_. length == 2)'를 사용하는 것이 좋기 때문에 값이없는 후행 키가있는 경우 무시됩니다. 이 코드는 후행 키의 경우 키와 동일한 값을 설정합니다. –

2

이 같은 일이 어쩌면 당신이 원하는 어떤 재귀 하나

val list = List("reserved slot", "key0", "value0", "key1", "value1", "key2", "value2") 
val list4Map = list.tail.grouped(2).map { listBy2 => (listBy2(0), listBy2(1)) }.toList 

val map = Map(list4Map: _*) 
+0

좋습니다. .toMap을 직접 사용하기 때문에 @Dima의 버전을 선호합니다. .toList를 사용하고 다음 단계에서지도를 만들 이유가 있습니까? 고마워! – angelcervera

+0

'grouped' 메쏘드는리스트의'Iterator'를 리턴합니다.'Map' 팩토리 메쏘드에 전달할 수 없습니다. Seq [Tuple2 [A, B]]가 필요합니다. 그래서'toList'를 추가했습니다. 사실, 당신의 목표를 성취 할 수있는 많은 방법들이 있습니다. 그래서 스칼라는 매우 유연합니다. :) 그리고 재미! : D –

+0

Thx! 예, 그것은 매우 유연하고 재미 있습니다. 나는 사랑에 빠지기 시작합니다. :) – angelcervera

0

을? : 의미 :

def seq2Map[T](seq: Seq[T]) = { 
    def rec(seq: Seq[T], map: Map[T,T] = Map.empty[T,T]): Map[T,T] = seq match { 
    case h :: t :: e => rec(e, map + (h -> t)) 
    case _ => map 
    } 
    rec(seq.tail) 
} 
0
(for { Seq(k, v) <- list.tail.grouped(2) } yield k -> v).toMap 

너무

+0

'val list = Vector ("무시", "물고기", "소원", "요리")'무엇입니까? 나는 List (k, v)가 Seq (k, v) 일 필요가 있다고 생각한다. –

+0

@RexKerr 'Seq'도'벡터'에 대해 동의합니다. –