2017-02-22 2 views
0

私は、TVレーティング(テレビ番組用)を自分のコードでそのレーティングのケースオブジェクトに変換する必要があります。あなたは私が面倒であり、まだ「tv.14」のようなものを考慮していないそれぞれの評価、のすべての順列に一致するようにしようとしている見ることができるようにアルゴリズムに基づいて大文字と小文字が一致する文字列。どのアルゴリズムを使うべきですか?

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) 
} 

、:したがって、私はそうのようなケースの試合を持っていますまたは "成熟した視聴者"である。

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 done –

+0

'Option []'型の全体点は_might_で 'None'です。なぜあなたの例は '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

私は未適用を忘れています。それは1つのクールな解決策です!私が見ているのは、正規表現が一緒に1つの場所に集まっているわけではないからです。質問: 'def main'の前で何をやっているのですか? – dlite922

+0

この回答は、私がOPが何かをほとんど探していないという上記の理由を説明しています(ただし、回答自体は問題ではありません)。 GeneralはPGにもマッチすることに注意してください。 Soundexが働く理由は、音声学の綴り(しかし、通常の奇妙な英語の問題にもかかわらず、多くの偽陽性と陰性が存在するにもかかわらず)にもかかわらず、単語のスペルから音までのマッピングがかなりよく理解されているからです。そして、ここで必要とされている「正確に正しいバケツにソートする必要はありません」ではなく、「十分に良い」マッチングのためにSoundexを使用する傾向があります。 –

関連する問題