2014-12-18 4 views
2

내가 키가 날짜를 나타내고 값이 걷고있는 문자열은 자바지도, stringMap을 가지고을 적용합니다. 이지도를 collection.mutable.HashMap[DateTime, Long]으로 변환해야합니다. 즉,지도 유형을 변경하는 것 외에도 Strings에서 DateTimes로 변경해야합니다.변환 맵은 해시 맵 및 변환

import scala.collection.JavaConversions._ 
val df = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
val stringMap: java.util.HashMap[String, Long] = ... 
val dateTimeMap = stringMap map { case (k, v) => (df.parseDateTime(k), v)} 
val result = collection.mutable.HashMap[DateTime, Long](dateTimeMap.toArray:_*) 

마지막 줄은 스칼라 해시 맵에 stringMap를 변환하는 암시 적 변환이 this post

주에서 온다 :

내가 현재 사용하고있는 솔루션입니다.

질문은 이것입니다, 더 좋은 방법이 있나요? 나는 yield/for breakout을 가진 맵 메소드를 사용했지만, 그들은 collection.mutable.HashMap 대신 Map을 리턴했다. 편집 : 분명히 breakout이 작동한다. 나는 당신의 질문을 이해한다면이 일을해야하는 경우 /EDIT

는 바람직 임시 dateTimeMap

답변

3

첫째, 여러 번 변환 실수 방지하기 위해 명시 적 변환을 얻을 대신 JavaConverters를 사용하는 것이 좋습니다입니다.

당신은 예상 된 결과 유형을 지정하여 mapbreakOut을 사용할 수 있어야합니다 :

import scala.collection.breakOut 
import scala.collection.JavaConverters._ 

val stringMap: java.util.HashMap[String, Long] = new java.util.HashMap() 
stringMap.put("1", 1L) 
stringMap.put("2", 2L) 

val result: collection.mutable.HashMap[Int, Long] = stringMap.asScala.map { case (k, v) => (k.toInt, v) }(breakOut) 
// result: scala.collection.mutable.HashMap[Int,Long] = Map(2 -> 2, 1 -> 1) 
+0

asscala 대신 암시 적 변환을 사용하는 경우를 제외하면 똑같은 작업을 수행하면 작동하지 않습니다. 불행하게도 현재 진행중인 프로젝트의 스타일 규칙은 명시 적 변환을 사용하지 않고 암시 적 변환을 사용하는 것입니다. 스타일 협약을 준수하면서이 작업을 수행 할 수있는 방법이 있습니까? –

+0

암시 적 버전이 저에게 효과적입니다. 그냥'JavaConverters'를'JavaConversions'로 대체하고'.asScala'를 버리면됩니다. – dhg

+0

아, 네 말이 맞아. 나는'map' 전에 점을 공백으로 대체하려고했습니다. 감사. –

0

필요없이이 작업을 수행하는 기능 프로그래밍 방법이 될 것입니다.

val result = collection.mutable.HashMap[DateTime, Long](stringMap.map{ case (k,v) => (df.parseDateTime(k),v)}.toArray:_*) 
+0

이 솔루션은 기본적으로 그냥 지금 그것에게 이름을주지 않고 dateTimeMap한다. 나는이 임시 맵을 만들 필요가 없기를 바래서, 잠시 후에 그것을 버리는 것이었다. 이 임시 맵을 건너 뛰고 곧바로 결과 맵을 작성하길 바랬습니다. –

+0

@KevinWheeler - 오케이. 위의 dhg 솔루션이 작동해야한다고 생각하십니까? –