7

それぞれの条件に基づいて、メンバーを含めるか含めないかのリストを作成する必要があります。

発注書を検証する必要があり、価格に応じて多くの人に通知する必要があるとしましょう。価格が 10 を超える場合は、スーパーバイザーに通知する必要があります。価格が 100 を超える場合は、スーパーバイザーとマネージャーの両方です。1000円以上ならスーパーバイザー、マネージャー、ディレクター。

私の関数は、入力として価格を取り、通知する人のリストを出力する必要があります。私は次のことを思いつきました:

def whoToNotify(price:Int) = {
  addIf(price>1000, "director",
        addIf(price>100, "manager",
              addIf(price>10, "supervisor", Nil)
        )
       )
}

def addIf[A](condition:Boolean, elem:A, list:List[A]) = {
  if(condition) elem :: list else list
}

プレーンな Scala でこれを行うより良い方法はありますか? addIfここで、関数を使用していくつかの車輪を再発明していますか?

価格のチェックは単純化されていることに注意してください。実際には、チェックは多くのデータベース フィールドでより複雑になり、組織階層に誰かを含めることは、その下のすべての人を含めることを意味しないため、リストを切り詰めるソリューションは機能しません。

編集

基本的に、不変リストを使用して、次のことを達成したいと考えています。

def whoToNotify(po:PurchaseOrder) = {
      val people = scala.collection.mutable.Buffer[String]()
      if(directorCondition(po)) people += "director"
      if(managerCondition(po)) people += "manager"
      if(supervisorCondition(po)) people += "supervisor"
      people.toList
}
4

4 に答える 4

4

を使用List#flatten()して、サブ要素からリストを作成できます。同時に 2 人を追加することもできます (以下の例ではマネージャーに対して行います)。

def whoToNotify(price:Int) =
  List(if (price > 1000) List("director") else Nil,
       if (price > 100) List("manager1", "manager2") else Nil,
       if (price > 10) List("supervisor") else Nil).flatten
于 2013-01-20T12:49:17.640 に答える
3

まあ、それはスタイルの問題ですが、私はすべての条件をより受け入れやすくするためにこのようにします-

case class Condition(price: Int, designation: String)

val list = List(                                                
                Condition(10, "supervisor"), 
                Condition(100, "manager") , 
                Condition(1000, "director") 
                )

def whoToNotify(price: Int) = {
        list.filter(_.price <= price).map(_.designation)
}     

すべての条件に対応し、要件に従って機能することができCondition classますfilter

于 2013-01-20T13:13:21.107 に答える
2

スタイルの問題ですが、関数の入れ子ではなく、ルールで通知する人のリストを保持することをお勧めします。addIf上記の例のようなものを持つことにはあまり価値がありません。

私の解決策。

val notifyAbovePrice = List(
    (10, "supervisor"),
    (100, "manager"),
    (1000, "director"))

def whoToNotify(price: Int): Seq[String] = {
  notifyAbovePrice.takeWhile(price > _._1).map(_._2)
}

現実の世界ではnotifyAbovePrice、タプルの代わりにオブジェクトがあり、順序がない場合、または順序が下位レベルでの通知を意味しない場合にfilter代わりに使用する場合があります。takeWhile

于 2013-01-20T12:38:36.930 に答える
1

メンバーの元のリストがある場合は、おそらくfilterメソッドの使用を検討することをお勧めします。最後に別のタイプのリストを持つようにメンバー オブジェクトも変換する場合collectは、部分関数を取るメソッドを見てください。

于 2013-01-20T12:40:04.687 に答える