2015-12-10 22 views
3

我需要將數據拆分爲多列。空白空間必須分佈在最後一列中。因此,如果我有四個元素和三列,列將具有這些元素數:2,1和1.在Scala中使用Int或者「或」運算符

我需要知道有多少列將被填滿。答案是:

val full = data.length % NUMBER_OF_COLUMNS 

但問題是,項目數是列數的倍數,這個返回零,這不是我想要的。所以我做:

val full = if (data.length % NUMBER_OF_COLUMNS == 0) NUMBER_OF_COLUMNS else 
    data.length % NUMBER_OF_COLUMNS 

這工作,但不會覺得很「斯卡拉樣。」這絕對是冗長而笨拙的,其餘的操作需要存儲或執行兩次。 (在這裏,我選擇了後者的選項。)

有沒有更好的方法?

在Python,我會做基本使用or運營商與Int,像這樣:

full = len(data) % NUMBER_OF_COLUMNS or NUMBER_OF_COLUMNS 

完成。但我想不出在斯卡拉類似的東西。它不存在還是我根本沒有看到它?

回答

5

使用圖案像這樣

len % nCols match { 
    case 0 => nCols 
    case v => v 
} 

注匹配所述第二模式相匹配的任何(非零)值,並提供已計算的模值。

+0

我更喜歡@迪瑪的解決方案,因爲它看起來更加緊湊,但這是目前爲止所有客觀性最好的解決方案。模式匹配是Scala的基礎。它的可讀性很強,很清晰,簡明扼要,回想起來看起來非常明顯,我覺得自己是一個完全沒有見過它的白癡。 – eje211

2
Option(x).filter(_ != 0).getOrElse(numColumns) 
+0

過濾一個'Option'!我怎麼看不到? – eje211