2017-04-10 13 views
0

저는 스칼라에서 초보자입니다. 아래 목록과 같이 map으로 변환하고 싶습니다. MultiMap을 사용해 보았지만 목표를 달성 할 수 없었습니다. 아무 도움도 없을 것입니다. 목록을 스칼라에서 멀티 맵으로 변경하는 방법은 무엇입니까?

val mymap= Map(rcdTypCd->Q1, 
    rcdTypCd->W1, 
    rcdTypCd->E1, 
    rcdTypCd->R1, 
    rcdTypCd->T1, 
    rcdTypCd->Y1, 
    rcdTypCd->U1, 
    rcdTypCd->I1, 
    rcdTypCd->O1, 
    rcdTypCd->P1) 

이하하는 난 (rcdTypCd)를 키를 호출 할 때마다 같은

object Mapis{ 
    def main(args: Array[String]) { 
     val list= 
     ("rcdTypCd"="Q1", 
     "rcdTypCd"="W1", 
     "rcdTypCd"="E1", 
     "rcdTypCd"="R1", 
     "rcdTypCd"="T1", 
     "rcdTypCd"="Y1", 
     "rcdTypCd"="U1", 
     "rcdTypCd"="I1", 
     "rcdTypCd"="O1", 
     "rcdTypCd"="P1") 
    //list type is Iterable[string] 
    val multiM = new HashMap[String, Set[String]] with MultiMap[String, String] 
     list.foreach { case (key, value) => multiM.addBinding(key, value) } 
    println(multiM) 
    }} 

출력은 모든 대응 값

println(key) 

는 아래와 같은 값을 모두 인쇄를 인쇄한다이어야

Q1,W1,E1,R1,T1,Y1,U1,I1,O1,P1 
+0

rcdTypCd의 유형과 값을 더 잘 설명 할 수 있습니까? – dirceusemighini

+0

@dirceusemighini, rcdTypCd는 영숫자입니다. –

답변

1

아마 MultiMap 가변 수집은 당신을 도울 것입니다 : 당신이 여기 변경 가능한 컬렉션을 필요로하는

import scala.collection.mutable{ HashMap, Set, MultiMap } 

// I assumed you have a list of tuples 
val list = List(
    "rcdTypCd" -> "Q1", 
    "rcdTypCd" -> "W1", 
    "rcdTypCd" -> "P1" 
) 

val mm = new HashMap[String, Set[String]] with MultiMap[String, String] 
list.foreach { case (key, value) => mm.addBinding(key, value) } 

println(mm) // Map(rcdTypCd -> Set(Q1, W1, P1)) 

그냥, 수입에주의. 그리고 docs을 확인하십시오.

+0

Andrei T, 재생 해 주셔서 감사합니다.이 오류가 발생합니다. (X, X) 생성자를 예상 유형에 인스턴스화 할 수 없습니다. 발견 : (T1, T2) 필수 : ​​문자열 sl.foreach {case (key, value) => mm.addBinding (key, value)} –

+0

현재 코드를 편집 해 주실 수 있습니까? 아니면 여기에 게시 하시겠습니까? –

+0

업데이트 된 코드를 참조하십시오. –

0

사용 foldLeft 당신은 기능을 수행하려는 경우 : 이름에서 알 수 있듯이

import scala.collection.immutable.Map 

    val original = List("sd=sdf") 

    original.foldLeft(Map[String, String]()) ((accumulatedValue: Map[String, String], str: String) => { 
    val array: Array[String] = str.split("=") 
    val newMap: Map[String, String] = accumulatedValue + (array(0) -> array.last) 
    newMap 
    }) 

으로 foldLeft 목록의 왼쪽에서 시작하는 단일 값으로 목록을 주름.

foldLeft은 카레 기능입니다. 전달하는 첫 번째 매개 변수는 시드라고하며이를 폴드의 시작점으로 생각할 수 있습니다. 두 번째 매개 변수는 두 개의 매개 변수 (누적 값과 목록의 요소에 누적 된 값)를 사용하고 접기의 다음 반복에서 사용할 새 값을 반환하는 함수입니다. 유형을 명확하게하기 위해 철자가 그려져 있습니다.

+0

나는 위의 코드 세트를 시도했으며이 맵 (rcdTypCd-> U1)과 같은 하나의 키와 값만 리턴합니다. –