2016-10-24 2 views
1

문자열에 정규식 목록을 적용하고 싶습니다. 나는 이것이 당신이 찾고있는 무엇을합니까 생각관용적 스케일러에서 체인 연산을 수행하는 방법

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

'는 완전히 대체'예를 들면, 단어의 일부를 대체하는 possiblity가 있습니다 "rmal 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(" ") 
관련 문제