将Python dict重写为Scala multimap(移植代码)?

2024-06-28 11:27:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将python库重写为Scala,以便与新项目更加兼容。 Python版本有一些基于dict的内存存储

class InMemoryStorage(BaseStorage):
  def __init__(self, config):
    self.name = 'dict'
    self.storage = dict()

  def keys(self):
    return self.storage.keys()

  def set_val(self, key, val):
    self.storage[key] = val

  def get_val(self, key):
    return self.storage[key]

  def append_val(self, key, val):
    self.storage.setdefault(key, []).append(val)

  def get_list(self, key):
    return self.storage.get(key, [])

我的scala版本还不太成熟,还不能确定是否需要改进它,因为我刚接触scala移植,它变得非常困难。我错过了什么?重写得够近了吗?你知道吗

class Storage {
  val internalStorage=new HashMap[String, Set[String]] with MultiMap[String, String]

  def keys():Iterable[String]={
    internalStorage.keys
  }

  def set_val(key:String,value:String)={
    internalStorage.addBinding(key,value)
  }

  def get_val( key:String):Set[String]= {
    return internalStorage(key)
  }

  def append_val( key:String, value:String)={
    internalStorage.addBinding(key,value)
  }

  def get_list(key:String):Set[String]={
    internalStorage(key)
  }
}

Tags: keyself版本getstringreturnvaluedef
1条回答
网友
1楼 · 发布于 2024-06-28 11:27:12

您走的是正确的道路,set_val需要重写初始的(key, value)(如果存在)并重新开始(从python代码中可以看到):

def set_val(key:String,value:String)={
  if (internalStorage.contains(key)) 
    internalStorage.remove(key); // to start fresh
  internalStorage.addBinding(key,value)
}

另外,由于internalStorage仅使用存储进行访问,因此您可能希望使其private。你知道吗

private[this] val internalStorage=new HashMap[String, Set[String]] with MultiMap[String, String]

相关问题 更多 >