是否有可能(甚至是值得)嘗試編寫下面的代碼塊而沒有var?它適用於一個變種。這不是面試,這是我第一次嘗試scala(來自java)。在純函數中使用var的工作scala代碼。這可能沒有var?
問題:儘可能地讓人們靠近劇院的前面,同時保持每個請求(例如Jones,4張門票)在一個劇院區域。從前面開始的劇院部分的大小爲6,6,3,5,5 ......等等。我試圖通過將所有潛在的票務請求組放在一起來完成此任務,然後選擇每個部分中最適合的組。
這裏是類。一個SeatingCombination是SeatingRequest(只是標識)的一個可能的組合及其ticketCount(S)的總和:
class SeatingCombination(val idList: List[Int], val seatCount: Int){}
class SeatingRequest(val id: Int, val partyName: String, val ticketCount: Int){}
class TheatreSection(val sectionSize: Int, rowNumber: Int, sectionNumber: Int) {
def id: String = rowNumber.toString + "_"+ sectionNumber.toString;
}
通過我們得到以下功能的時間... 1)所有可能的SeatingRequest的組合在SeatingCombination的列表中並按降序排列。 2.)所有TheatreSection按順序列出。
def getSeatingMap(groups: List[SeatingCombination], sections: List[TheatreSection]): HashMap[Int, TheatreSection] = {
var seatedMap = new HashMap[Int, TheatreSection]
for (sect <- sections) {
val bestFitOpt = groups.find(g => { g.seatCount <= sect.sectionSize && !isAnyListIdInMap(seatedMap, g.idList) })
bestFitOpt.filter(_.idList.size > 0).foreach(_.idList.foreach(seatedMap.update(_, sect)))
}
seatedMap
}
def isAnyListIdInMap(map: HashMap[Int, TheatreSection], list: List[Int]): Boolean = {
(for (id <- list) yield !map.get(id).isEmpty).reduce(_ || _)
}
我寫了沒有var的程序的其餘部分,但在這個迭代部分,它似乎是不可能的。也許我的實施策略是不可能的。從我讀過的內容看,純函數中的var仍然有效。但它一直困擾着我,我想不出如何去除var,因爲我的教科書告訴我要儘量避免它們,而我不知道我不知道什麼。
它看起來像'foldLeft'工作。 – Nebril