在Scala中修改通用映射

时间:2016-09-02 15:11:55

标签: scala generics collections

在Java过去10年以及Groovy的最后一年里,我是Scala的新成员。嗨斯卡拉!

对于我的生活,我似乎无法获得以下代码片段进行编译,其只是复杂到足以让Google Gods无法帮助我。

我有一个地图,其中包含键的字符串和值的元组列表。元组将是一个String-Long对。在Groovy中,这看起来像:

Map<String,List<Tuple2<String,Long>>> data = [:]

我需要能够为此地图添加和修改键和值。具体来说,我需要:

  1. 添加到现有密钥的元组列表
  2. 如果某个键不存在,请实例化一个新的元组列表,然后将该键和列表添加为映射条目
  3. 在Groovy中,这看起来像:

    Map<String,List<String,Long>> data = [:]
    
    def addData(String key, String message) {
        Long currTime = System.currentTimestampInMillis()
        Tuple2<String,Long> tuple = new Tuple2<String,Long>(message, tuple)
    
        if(data.contains(key)) {
            data.key << tuple
        } else {
            data[key] = new List<Tuple2<String,Long>>()
            data.key << tuple
        }
    }
    

    我在Scala尝试这样做,虽然没有成功。

    迄今为止我最好的尝试:

    object MapUtils {
        // var data : Map[String,ListBuffer[(String,Long)]] = Map()
        val data = collection.mutable.Map[String, ListBuffer[(String, Long)]]()
    
        def addData(key : String, message : String) : Unit = {
            val newTuple = (message, System.currentTimeMillis())
            val optionalOldValue = data.get(key)
    
            optionalOldValue match {
                case Some(olderBufferList) => olderBufferList += newTuple
                case None => data
                    .put(key, ListBuffer[(String, Long)](newTuple))
            }
        }
    }
    

    case Some(olderBufferList) => olderBufferList += newTuple行上抱怨此编译器错误:

    value += is not a member of Any
    

    我有什么想法可以做这个编译&amp;工作

2 个答案:

答案 0 :(得分:1)

您需要的简短版本将是:

val map = mutable.Map[String, ListBuffer[(String, Long)]]()
map.put(key, map.getOrElse(key, ListBuffer[(String, Long)]()) += ((message, System.currentTimeMillis())))

您的代码存在一些语法问题,如果我尝试更改addData,它将如下所示:

def addData(key : String, message : String) : Unit = {
  val newTuple = (message, System.currentTimeMillis())
  val optionalOldValue = map.get(key)

  optionalOldValue match {
    case Some(olderBufferList) => olderBufferList += newTuple
    case None => map.put(key, ListBuffer[(String, Long)](newTuple))
  }
}

答案 1 :(得分:1)

{1}}您遗漏了import。以下代码在2.9.1(在TryScala上测试),2.11.7(在IDEOne上测试)和2.11.8完全正常。请注意,唯一添加的是添加ListBuffer的第一行:

import