将Hashmap(k,v)值"与字符串列表进行比较" - 是否有更好的Scala实现

时间:2015-01-12 10:06:04

标签: scala hashmap contains

我有以下Scala代码。它通过调用isKeywordInTopicTitle(keyword)来过滤HashMap的(k,v)值。 这与单词列表进行比较,检查wordList中的任何一个是否包含"包含#34;。

val hashWithSearchKeywords = readlinks.values.filter(isKeywordInTopicTitle(_))
[snip]

def isKeywordInTopicTitle(keyword: String): Boolean = {
  val wordList = List("engine", "deluxe", "motor", "VW", "EMPI")

  (wordList.foldLeft(false)( _ || keyword.contains(_) ))
}

是否有更有效的方法(对于不是专家的功能程序员来说,这是可读/可理解的)? :O)

由于

数。

3 个答案:

答案 0 :(得分:4)

好吧,我猜那行

(wordList.foldLeft(false)( _ || keyword.contains(_) ))

您可以将其重写为

wordList exists keyword.contains

后者更具可读性。

答案 1 :(得分:1)

考虑在collect上使用HashMap,这会产生简洁的代码,就像这样,

val hashWithSearchKeywords =  readlinks.collect { 
  case m@(k, v) if wordList.contains(v) => m 
}

这会提供符合条件的地图(key,value)对(即(m._1,m._2))。

<强>更新

更多关于简明代码的附带评论,请考虑val wl = wordList.toSet,因此

val hashWithSearchKeywords = readlinks.collect { case m@(k, v) if wl(v) => m }

答案 2 :(得分:0)

其他答案解决了一些可读性问题。我只是添加一个,只要你为Set使用原生HashSetwordList,那么效率就不会高得多。 HashSet确保O(1)查找。