[英]how to implement Nested Map in scala
我正在嘗試在play框架的scala中實現嵌套地圖。 我要實現的是Map[String, Map[Long,Int]]
類型的Map[String, Map[Long,Int]]
。 我無法分配本身就是地圖的父地圖的值。 應用程序正在正確編譯,但是值未更新。 您能否建議我做錯了什么以及如何將地圖值分配給另一張地圖?
import java.util.concurrent.ConcurrentHashMap
import scala.collection._
import scala.collection.convert.decorateAsScala._
import scala.collection.JavaConversions.mapAsScalaMap
case class Events(eventType: String, timeStamp: Long)
object Events {
var eventMap = new ConcurrentHashMap[String, ConcurrentHashMap[Long,Int]]()
def save(events: Events) = {
var eventsKey: String = ""
var count: Int = 1
var timeKey: Long = 0L
var newEntry: Boolean = false
eventsKey = events.eventType
var countMap = new ConcurrentHashMap[Long,Int]()
countMap.clear()
if (eventMap.containsKey(eventsKey)) {
countMap = eventMap.get(eventsKey) // this is not working
timeKey = events.timeStamp
if (countMap.containsKey(timeKey)) {
count = countMap(timeKey) + 1
countMap.put(timeKey, count)
eventMap.put(eventsKey, countMap)
} // End of counter check
else {
newEntry = true
}
} // End of if event key check
else {
newEntry = true
} // End of else event key check
if (newEntry) {
countMap.putIfAbsent(timeKey, 1)
eventMap.putIfAbsent(eventsKey, countMap)
}
}
}
發生問題是因為您僅在if中設置了臨時timeKey
,而在if外仍需要此值。 這將使您的程序始終將給定eventType
的第一個timeStamp
插入為0
:
Events.save(Events("aa", 222)) // {aa={0=1}}
Events.save(Events("aa", 333)) // {aa={0=1, 333=1}}
Events.save(Events("aa", 333)) // {aa={0=1, 333=2}}
Events.save(Events("bb", 444)) // {aa={0=1, 333=2}, bb={0=1}}
要解決此問題,只需將代碼移出if
:
...
var newEntry: Boolean = false
eventsKey = events.eventType
timeKey = events.timeStamp // <--- This fixes it
var countMap = new ConcurrentHashMap[Long,Int]()
countMap.clear()
if (eventMap.containsKey(eventsKey)) {
countMap = eventMap.get(eventsKey) //this is not working
if (countMap.containsKey(timeKey)) {
count = countMap(timeKey) + 1
...
現在,當您運行時,您將獲得:
Events.save(Events("aa", 222)) // {aa={222=1}}
Events.save(Events("aa", 333)) // {aa={333=1, 222=1}}
Events.save(Events("aa", 333)) // {aa={333=2, 222=1}}
Events.save(Events("bb", 444)) // {aa={333=2, 222=1}, bb={444=1}}
我知道您沒有詢問它,但是我認為擁有一個更慣用的Scala代碼會很好:
case class Event(eventType: String, timeStamp: Long)
object Event {
val eventMap = new ConcurrentHashMap[String, ConcurrentHashMap[Long,Int]]()
def save(event: Event) = {
val Event(eventKey, timeKey) = event
val countMap = eventMap.getOrElse(eventKey, new ConcurrentHashMap[Long,Int]())
val count = countMap.getOrElse(timeKey, 0) + 1
countMap.put(timeKey, count)
eventMap.put(eventKey, countMap)
}
}
PS:我將Events
重命名為Event
PS2:請注意,當您以一種更加慣用的方式進行編程時,您偶然發現的錯誤是多么難以發生。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.