2017-05-04 1 views
2

지도 내에 키가 있는지 확인하고 싶으면 값이 1 씩 증가하고 싶습니다. 존재하지 않는다면 Map에 값이 1 인 새 항목을 넣고 싶습니다.지도를 업데이트하는 기능적인 방법

'기능적인 방법'은 무엇입니까? 나는 find와 fold를 사용하여 그것을 썼다. 그러나 그것은 다소 이상해 보인다.

val updatedScore = currentScores 
    .find(s => s._1.equals(score)) 
    .fold(score -> 1)(s => s._1 -> (s._2 + 1)) 

val newScores = currentScores + updatedScore 

누구나 더 좋은 해결책이 있습니까?

답변

8

당신은 이런 식으로 작업을 수행 할 수 있습니다

val newScores = currentScores + (score -> (currentScores.getOrElse(score, 0) + 1)) 
0
val updatedScore = score -> (currentScores(score)+ 1) 
val newScores= currentScores - score + newScore 
1
val ret: mutable.Map[Int, Int] = mutable.Map[Int, Int]().withDefaultValue(1) 
val arg = 5 
ret.update(arg, ret(5)+1) 
+1

"기능적"은 일반적으로 "부작용 방지"를 의미합니다. 'update'는 부작용입니다. –

+1

나는 이것을 얻지 못한다 : 왜 이것이 부작용인가? 내 말은 -이 모든 질문은 변경 가능한지도를 업데이트하는 것입니다, 그렇습니까? – user7938511

+0

이것은 유효한 대답입니다. 허용 된 대답은 OP가 원했던 것입니다. 그러나 전체 맵을 새 맵으로 복사해야하므로 매우 비효율적입니다. 가변적 인 데이터 구조는 이유가 있기 때문에 scala에있다. – Akavall

관련 문제