2
A
답변
6
이 작업을 정의하는 데는 여러 가지 방법이 있습니다. 나는 내가 가장 명확한 것을 발견 한 몇 가지를 걷게 될 것이다. 첫 번째 구현을 위해 내가 도우미 메서드로 시작합니다 :
는def flattenNestedMap[A, B, C](nested: Map[A, Map[B, C]]): Map[(A, B), C] =
for {
(a, innerMap) <- nested
(b, c) <- innerMap
} yield (a, b) -> c
이 값 쌍에서지도에 중첩 된지도를 평평하게. 다음으로 우리는 우리에게 필요한 것을 거의 얻을 수있는 또 다른 도우미 연산을 정의 할 수 있습니다.
def invert[A, B, C](nested: Map[A, Map[B, C]]): Map[B, Map[A, C]] =
groupByBs(flattenNestedMap(nested)).mapValues(
_.map {
case ((a, _), c) => a -> c
}
)
(mapValues
이 결과는 당신이 사용할 때마다 다시 계산된다는 것을 의미하는 게으른 것을 참고 :
def groupByBs[A, B, C](flattened: Map[(A, B), C]): Map[B, Map[(A, B), C]] =
flattened.groupBy(_._1._2)
지금 우리는 단지 내부 맵의 키에서 중복 B
를 제거해야 . 그것은 일반적으로이 문제가되지 않습니다, 쉬운 해결 방법이 있습니다,하지만 그들은 질문에 정말 관련이없는 것)
그리고 우리는 완료 :.
scala> invert(Map(1 -> Map(2 -> 3), 10 -> Map(2 -> 4)))
res0: Map[Int,Map[Int,Int]] = Map(2 -> Map(1 -> 3, 10 -> 4))
도우미 메서드를 건너 뛰고 연산을 invert
에 연결할 수 있습니다. 나는 그것들을 조금 더 명확하게 부 풀리는 것을 발견했다. 그러나 그것은 스타일의 문제 다.
scala> invert(Map(1 -> Map(2 -> 3), 10 -> Map(2 -> 4)))
res1: Map[Int,Map[Int,Int]] = Map(2 -> Map(1 -> 3, 10 -> 4))
foldLeft
버전은 간단 필수적 버전 로지텍은의 모양을 더 가지고 같은 일을
def invert[A, B, C](nested: Map[A, Map[B, C]]): Map[B, Map[A, C]] =
nested.foldLeft(Map.empty[B, Map[A, C]]) {
case (acc, (a, innerMap)) =>
innerMap.foldLeft(acc) {
case (innerAcc, (b, c)) =>
innerAcc.updated(b, innerAcc.getOrElse(b, Map.empty).updated(a, c))
}
}
:
은 다른 방법은 주름의 몇 가지를 사용할 수 있습니다 (기능적으로) 외부 및 내부 맵의 키 - 값 쌍을 반복하여 결과를 구축합니다. 내 머리 꼭대기에서 좀 더 효율적이라고 생각 하겠지만, 그 점에 대해서는 잘 모르겠습니다. 그리고별로 중요하지 않으므로 개인적으로 더 명확하게 선택하는 것이 좋습니다.
-1
할 수 있습니다 단순히 주어진지도 컬렉션 맵 작업을 사용하여 수행
scala> Map("A" -> Map("B" -> "C"), "X" -> Map("Y" -> "Z"))
res1: scala.collection.immutable.Map[String,scala.collection.immutable.Map[String,String]] = Map(A -> Map(B -> C), X -> Map(Y -> Z))
scala> res1.map{ case (key, valueMap) => valueMap.map{ case (vmKey, vmValue) => (vmKey -> Map(key -> vmValue)) } }
res2: scala.collection.immutable.Iterable[scala.collection.immutable.Map[String,scala.collection.immutable.Map[String,String]]] = List(Map(B -> Map(A -> C)), Map(Y -> Map(X -> Z)))
관련 문제
- 1. Monocle을 사용하여 중첩 된지도를 업데이트하는 올바른 구문
- 2. 안드로이드 - 중첩 된지도를 JSON 문자열로 변환
- 3. Clojure : 중첩 된지도를 특정 키로 축소하는 방법?
- 4. 가변 깊이의 중첩 된지도를 만드는 방법
- 5. 목록에서 깊이 중첩 된지도를 필터링하려면 어떻게해야합니까?
- 6. 도형 스칼라에서 중첩 요청을하는 방법
- 7. 스칼라에서 중첩 목록의 역방향 처리
- 8. 목록에 중첩 된지도를 변환하는 방법 <Object>
- 9. Scala에서 Map [String, Map [String, Any]] 유형의 중첩 된지도를 JSON으로 변환하는 방법은 무엇입니까?
- 10. PHP에서 중첩 배열을 되돌릴 수있는 빠르고 쉬운 방법이 있습니까? 역으로
- 11. 파이썬의 행렬을 역으로 표현합니다.
- 12. FFTW3 역으로 작동하지 않습니다
- 13. 파이썬에서 어떻게 역으로 작동합니까?
- 14. mysql 리소스를 역으로 변경
- 15. Java - 목록이 포함 된지도를 반복하십시오.
- 16. 스칼라에서 중첩 클래스의 패턴 일치 방법은 무엇입니까?
- 17. 스칼라에서 중첩 된 반응 (또는 수신)
- 18. 해시 맵으로 중첩 된 중첩 HashMap을 스칼라에서 json으로 변환하려면 어떻게해야합니까?
- 19. 트리 스캔을 역으로 수행 할 수 있습니까?
- 20. gh 구성 명령을 역으로 변경하십시오.
- 21. 신경망을 역으로 실행할 수 있습니까?
- 22. StringBuilder가 초기 변수를 역으로 변경합니까?
- 23. 부동 소수점과 역으로 고정 소수점
- 24. 스칼라에서
- 25. 정렬 된지도를 스칼라로 만드는 방법은 무엇입니까?
- 26. 새로운 지리적지도 데이터를 만들거나 수정 된지도를 사용하십시오.
- 27. Clojure/EDN에서 정렬 된지도를 직렬화 하시겠습니까?
- 28. iframe 삽입 된지도를 클릭하면 포인터 이벤트가 활성화됩니다.
- 29. 스칼라에서 임의로 중첩 된 목록의 조건 자와 일치하는 요소 "바꾸기"
- 30. 스칼라에서, 포함하는 클래스 외부의 중첩 된 유형을위한 팩토리를 빌드하려면 어떻게해야합니까?
당신이지도'으로 어떻게 할 것인지 (1 ->지도 (2 -> 3), (10) ->지도 (2 -> 4))', 중복되는'B'가 있는가? –
@MichaelZajac 어쩌면 나는 의도를 오해하고있다.하지만'Map (2 -> Map (1 -> 3, 10 -> 4)) '의 무엇이 잘못 되었습니까? –
@TravisBrown 전혀 없습니다. OP가지도를 결합하고 싶다면 나는 몰랐다. –