商品樣式價格算法

jopen 9年前發布 | 12K 次閱讀 算法

    一個商品可能有多個樣式,而這個商品的價格可能會根據其組成的樣式不同而不同。

例如:

    

</tr>

</tr>

</tr>

</tr> </tbody> </table>

 ......

    假設我們這么建模(使用scala case class來表示)

case class GoodsStyle(id:GoodsId,style:Seq[StyleName],money:BigDecimal)
//GoodsStyle("goodsId...",Seq("紅","圓","大"),BigDecimal(23))


    雖然可以準確的應對各種樣式組合,但上面的建模會產生3(顏色)*2(形狀)*3(大小)=18條數據。

    當用戶在前端輸入時,他該如何輸入呢,難道要輸入18條數據?而且,有一些樣式和價格可能是無關的,例如上面`樣品1`的顏色。      

   因此,我們引入一個無關量`Nu`,代表該樣式和價格無關。

case class GoodsStyle(id:GoodsId,style:Seq[StyleName],money:BigDecimal)
val Nu=""
//GoodsStyle("goodsId...",Seq(Nu,"圓","大"),BigDecimal(23))


    并引入一個查找價格的算法

//by timzaak
//使用scala編寫,性能有些損耗,但基本能表述清楚。
@tailrec
def getPrice(s:Seq[I],secondResult:Seq[GoodsStyle],i:I,result:Seq[GoodsStyle]):Seq[GoodsStyle]={//secondResult,代表第二可匹配的集合
  if(i==s.length){
    result
  }else{
    val style= s(i)
    val map=result.groupBy(_.styles(i)==style).withDefault(_=>Seq.empty[Style])
    val nextResult =map(true)
    val nextSecondResult:Seq[Style] = if(style==Nu){//在正式過程中,style不應該為Nu,該判定可根據實際情況來確認是否干掉
      Seq.empty
    }else{
      map(false).filter(_.styles(i)==Nu)//從不能精確匹配的集合中,找出可以任意的(Nu)集合
    }++secondResult
    if(nextResult.isEmpty){
      getPrice(s,Seq.empty,i+1,nextSecondResult)
    }else{
      getPrice(s,nextSecondResult,i+1,nextResult)
    }
  }
}


上面的算法能返回最匹配所給樣式的`GoodsStyle`。

上面的解決方案會使前端爽很多,符合數據輸入時的邏輯,而它所帶來的問題,則是當輸入數據邏輯有問題時,并不太容易排查出來,需要當價格匹配不出來時的異常處理。

來自:http://my.oschina.net/myprogworld/blog/382715

</div>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
商品名 顏色(紅,黑,白) 形狀(圓,方) 大小(大,中,小) 價格(元)
樣品1 23
樣品1 22
樣品1 22
  • sesese色