2016-10-24 45 views
1

我想將正則表的列表應用於字符串。我目前的做法是不是很實用如何在慣用的scala中鏈接操作

我當前的代碼:

val stopWords = List[String](
    "the", 
    "restaurant", 
    "bar", 
    "[^a-zA-Z -]" 
) 

    def CanonicalName(name: String): String = { 
    var nameM = name   
    for (reg <- stopWords) { 
     nameM = nameM.replaceAll(reg, "") 
    } 

    nameM = nameM.replaceAll(" +", " ").trim 
    return nameM 
    } 
+0

只是一個快速提示,我建議養成使用數組的小習慣,固定大小的集合,它們具有更好的性能特徵。請參閱http://www.lihaoyi.com/post/BenchmarkingScalaCollections.html#take-aways – Yawar

回答

2

我覺得這樣是你在找什麼。

def CanonicalName(name: String): String = { 
    val stopWords = List("the", "restaurant", "bar", "[^a-zA-Z -]") 
    stopWords.foldLeft(name)(_.replaceAll(_, "")).replaceAll(" +"," ").trim 
} 
0

「的replaceAll」具有方法可行替換單詞的一部分,例如:「熱&燒烤店」被替換爲「腎錯構瘤becue」。如果你想要的是「熱燒烤」,你可以先分開名字,然後逐字地應用你的停用詞規則:

def isStopWord(word: String): Boolean = stopWords.exists(word.matches) 

def CanonicalName(name: String): String = 
    name.replaceAll(" +", " ").trim.split(" ").flatMap(n => if (isStopWord(n)) List() else List(n)).mkString(" ")