2017-02-22 6 views
0

TV 등급 (TV 프로그램 용)을 내 코드에서 해당 등급의 사례 개체로 바꿀 필요가 있습니다. 따라서 나는 경우 매치과 같이 있습니다대소 문자가 일치하는 대소 문자가 알고리즘을 기반으로합니다. 어떤 알고리즘을 사용해야합니까?

def fromString(s: String): Option[TvRating] = s.toLowerCase match { 
    case "tvy" | "tv-y" | "tv y" | "y" => Some(tvY) 
    case "tvg" | "tv-g" | "tv g" | "g" => Some(tvG) 
    case "tvpg" | "tv-pg" | "tv pg" | "pg" => Some(tvG) 
    case "tv14" | "tv-14" | "tv 14" | "14" => Some(tv14) 
    case "tvma" | "tv-ma" | "tv ma" | "ma" => Some(tvMA) 
    case _ => Some(noTvRating) 
} 

당신은 내가 "tv.14"같은 것들을 고려하지 않습니다 여전히 복잡 각 등급의 모든 순열과 일치하도록 노력하고있어 볼 수 있듯이, 또는 "성숙한 관객".

soundX와 같은 알고리즘이 있지만 최후의 수단으로 사용할 수있는 이러한 등급과 같은 코드가 있습니다. 그러면 내 코드는 다음과 같이 보입니다.

def fromString(s: String): Option[TvRating] = s.toLowerCase match { 
    case "tvy" | "tv-y" | fancyAlgo(s, "tv-y") => Some(tvY) 
    case "tvg" | "tv-g" | fancyAlgo(s, "tv-g") => Some(tvG) 
    case "tvpg" | "tv-pg" | fancyAlgo(s, "tv-pg") => Some(tvG) 
    case "tv14" | "tv-14" | fancyAlgo(s, "tv-14") => Some(tv14) 
    case "tvma" | "tv-ma" | fancyAlgo(s, "tv-ma") => Some(tvMA) 
    case _ => Some(noTvRating) 
} 

또는 이러한 일치를보다 강력하게 만들 수있는 다른 제안. tv-g는 "개"또는 "말"과 같은 단어가 아니기 때문에 오디오 나 비슷한 소리의 단어를 기반으로 할 수 없습니다.

이것은 등급의 한 예입니다. 다른 성냥도 있습니다. 별표 평점 (썩은 토마토의 영화 등급 등)에 대한 또 다른 예는 다음과 같습니다

def fromString(s: String): Option[StarRating] = s.toLowerCase match { 
    case "1" | "one star" | "one stars" => Some(oneStar) 
    case "1.5" | "1.5 stars" | "one and a half stars" => Some(oneAndHalfStar) 
    case "2" | "2 stars" | "two stars" => Some(twoStars) 
    case "2.5" | "2.5 stars" | "two and a half stars" => Some(twoAndHalfStars) 
    case "3" | "3 stars" | "three stars" => Some(threeStars) 
    case "3.5" | "3.5 stars" | "three and a half stars" => Some(threeAndHalfStars) 
    case "4" | "4 stars" | "four stars" => Some(fourStars) 
    case _ => Some(noStars) 
} 

건배!

+0

내가 찾는 항목과 일치하는 퍼지 문자열은 무엇입니까? – dlite922

+0

당신이 의미하는 바를 봅니다. 그러나 나는 (일반적으로) 거의 불가능한 것을 요구하고 있습니다. "pg"를 의미하는 것이나 "pg"를 의미하는 것에 대한 규칙을 언급하지 않고서는 무엇이든 일치하는 것으로 생각합니다. 퍼지 스트링 매치가 아니기 때문에 일치하는 것이 무엇인지, "tv-14"(예를 들어, "14"가 일치해야합니까?)라고 말할 수있는 것에 대해 좀 더 자세히 설명 할 수 있다면 뭔가 할 수 있습니다. be done –

+0

'Option []'타입의 전체적인 점은 _ None이 될 것이다. 귀하의 사례에 '없음'상태가없는 이유는 무엇입니까? – jwvh

답변

2

이동 데이터 구동 :

val ratings = scala.collection.mutable.Map[String, String]() withDefaultValue "noTVRating" 

type TvRating = String 

def addRatingStyle(base:String, result:String) = { 
    val suffix = base.stripPrefix("tv") 
    ratings += ("tv"+suffix->result) 
    ratings += ("tv-"+suffix->result) 
    ratings += ("tv "+suffix->result) 
    ratings += (suffix->result) 
} 

addRatingStyle("tvy", "tvy") 
addRatingStyle("tvg", "tvg") 
addRatingStyle("tvpg", "tvpg") 
addRatingStyle("tv14", "tv14") 
addRatingStyle("tvma", "tvma") 


def fromString(s: String): Option[TvRating] = Some(ratings(s.toLowerCase)) 
+0

흥미로운 솔루션 때문에 upvoted,하지만 내 일치하는 문제를 해결하지 않습니다. 문제는 접두사가 항상 "", "-"또는 ""인지 여부를 모르겠다는 것입니다. 그렇지 않으면 위의 컨텍스트 오버로드를 프로그래머에 추가하지 않고 원래의 일치가 작동합니다. 독창적 인 반면 알고리즘은 "최상의"일치를 찾는 데 사용하지 않습니다. – dlite922

2

사용 case objectunapply 방법으로 개별 평가를 정의 할 수 있습니다. 간단한 정규 표현식을 사용하면 나머지 부분을 처리 할 수 ​​있습니다.

sealed trait TVRating 

case object Youth extends TVRating { 
    def unapply(s: String): Option[TVRating] = { 
    //insert fancier match logic here... 
    if(s.matches("tv.*y") || s.equals("y")) { 
     Some(Youth) 
    } else { 
     None 
    } 
    } 
} 

case object General extends TVRating { 
    def unapply(s: String): Option[TVRating] = { 
    //insert fancier match logic here... 
    if(s.matches("tv.*g")) { 
     Some(Youth) 
    } else { 
     None 
    } 
    } 
} 

object Main extends App { 

    override def main(args: Array[String]) = { 
    "tv.y" match { 
     case Youth(s) => println("Youth") 
     case General(s) => println("General") 
     case _ => println("Unknown") 
    } 
    } 
} 
+0

나는 미적용을 잊어 버린다. 그것은 하나의 멋진 솔루션입니다! 내가 볼 수있는 유일한 측면은 정규 표현식이 나를 보거나 추가 할 수있는 한 곳에서 함께 있지 않다는 것입니다. 질문 :'def main' 앞에서 무엇을하고있는 오버 라이드입니까? – dlite922

+0

이 대답은 내가 OP가 뭔가 불가능한 것을 추구하고 있다는 것을 위에 논평 한 이유를 설명합니다 (그러나 대답 자체는 문제가 아닙니다). General은 PG와도 일치합니다. Soundex가 작동하는 이유는 소리의 철자에서 소리까지의 매핑이 꽤 잘 알려져 있기 때문입니다. 음성학은 그렇지만 (보통 기괴한 영어 문제로 인해 많은 위양성과 음화가있을지라도). 그리고 Soundex를 "올바른 양동이로 정확하게 정렬해야합니다."와 같은 "좋은"일치 유형으로 사용하는 경향이 있습니다. –