如何将函数map.getORelse模仿为CSV文件

时间:2017-05-10 19:38:29

标签: scala dictionary

我有一个代表地图[String,Int]的CSV文件,然后我按如下方式读取文件:

def convI2N (vkey:Int):String={

    val in = new Scanner("dictionaryNV.csv")
    loop.breakable{
    while (in.hasNext) {
      val nodekey = in.next(',')
      val value  = in.next('\n')
      if (value == vkey.toString){
        n=nodekey
        loop.break()}
    }}
    in.close
    n
  }

该函数给出给定Int的String。这里的问题是我必须浏览整个文件,文件很大,然后程序太慢了。有人告诉我这是O(n)复杂时间,并建议我传递给O(log n)。我想函数map.getOrElse是O(log n)。 有人可以帮我找到一种方法来获得这段代码的最佳表现吗?

作为附加注释,dictionaryNV文件按Int值排序 也许我可以按行或一组行分割文件。 CSV有167000个元组[String,Int]

或者另一种方式是如何通过scala中的csv进行某种二进制搜索?

1 个答案:

答案 0 :(得分:0)

如果您多次呼叫confI2N功能,那么每次必须scan big file时,工作肯定会很慢。因此,如果多次调用该函数,则建议将它们存储在临时变量propertieshashmapcollection of tuple2中,并更改正在占用内存的其他代码。

您可以尝试以下方式,该方式应该比scanner方式更快 假设您的csv文件comma分隔为

key1,value1
key2,value2

使用Source.fromFile可以作为您的解决方案

def convI2N (vkey:Int):String={
  var n = "not found"
  val filtered = Source.fromFile("<your path to dictionaryNV.csv>")
    .getLines()
    .map(line => line.split(","))
    .filter(sline => sline(0).equalsIgnoreCase(vkey.toString))

  for(str <- filtered){
    n = str(0)
  }
 n
}