簡體   English   中英

如何在Scala中實現嵌套地圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM