樣品1 |
黑 |
方 |
大 |
22 |
</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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
sesese色