3

次のようなコードを書いていることに気づきました。

  def language(frequencies: Array[String], text: Array[String]) = {
    val allText = text.mkString.replace(" ", "")

    val emaps = for {
      fset <- frequencies
      devs = for {
        i <- 'a' to 'z'
        p = fset.indexOf(i) match {
          case -1 => 0d
          case x  => fset.substring(x + 1, x + 3).toDouble / 100 * allText.size
        }
        a = allText.count(i ==)
        dev = math.pow(p - a, 2)
      } yield dev
    } yield devs.sum

    emaps.min
  }

ご覧のとおり、値emapsは文字列の配列から作成されたDoubleの配列です。正常に動作します。私は今まで見たことがありません-このようにネストされた内包表記。大丈夫ですか、それとも何とかリファクタリングする必要がありますか?

4

2 に答える 2

7

map一般に、for構文のループ部分に長いコードブロックを記述するよりも、友人を使用する方が標準的です。また、allTextは頻度に依存しないため、最初に1回実行できます。

val lcounts = 'a' to 'z' map {i => i -> allText.count(i==)} toMap
val emaps = frequencies.map { fset =>
  val devs = 'a' to 'z' map { i =>
    val p = fset.indexOf(i) match {
      case -1 => 0d
      case x  => fset.substring(x+1, x+3).toDouble / 100 * allText.size
    }
    math.pow(p - lcounts(i), 2)
  }
  devs.sum
}

(また、負の値を2乗してもよろしいですか?つまり、allText.count(i ==)はゼロ以外ですが、fset.indexOf(i)は-1ですか?それは奇妙に思えます。)

于 2011-08-23T02:25:17.573 に答える
0

一致ステートメントまたは単純なもの以外のものを使用するとすぐに、そこでメソッドを使用するかどうかを確認します。適切な名前を付けると、コードがIMOを読みやすくなります。

于 2011-08-23T06:28:26.907 に答える