這是一個可以根據年齡推斷出一個人的狀態的函式
def getStatus(age: Int): String = {
age match {
case age if 0 until 2 contains age => "infant"
case age if 2 until 10 contains age => "child"
case age if 10 until 18 contains age => "teen"
case _ => "adult"
}
}
假設邊界可以改變。我們可以決定一個人在 3 歲之前可以被視為嬰兒。隨著它們的變化,我們不希望邊界被硬編碼,它們將被存盤在外部。
什么是可以基于間隔存盤映射的資料結構?
就像是
val intervalMap = IntervalMap(
(0, 2) -> "infant",
(2, 10) -> "child",
(10, 18) -> "teen",
(18, 200 ) -> "adult"
)
intervalMap(1) // "infant"
intervalMap(12) // "teen"
我正在使用 Scala 進行開發,但非常感謝與語言無關的答案。
uj5u.com熱心網友回復:
簡單的答案
Scala 標準庫中沒有任何東西可以做到這一點,但是如果“類別”的數量像您的示例中那樣低,那么在您的類上實作一個簡單的O(N) apply方法是沒有害處的IntervalMap。
def apply(in: Int) = categories.collectFirst {
case ((min, max), value) if in >= min && in < max => value
}
番石榴
看起來 Guava 庫有一個RangeMap似乎適合您的用例的類。
更高級的 DIY 理念
要獲得O(log N)查找特征,您可以將類別資料表示為二叉樹:
- 每個節點定義一個
min和max - 根節點表示絕對最小值到絕對最大值,
Int.MinValue例如Int.MaxValue - 葉節點定義一個
value(例如"child") - 非葉子節點定義一個
split值,其中左孩子的max將等于split,而右孩子的min將等于分裂 - 根據您的輸入數(例如
age)是否大于或小于當前節點的數,通過左/右遍歷來查找樹中的值split
您必須在構建樹時處理平衡樹......而TBH這可能是番石榴在幕后所做的事情(我沒有研究實作)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/465619.html
上一篇:如何從Scala貓IO中提取價值
