2017-03-06 38 views
0

假設我有下面的代碼,有沒有什麼辦法來簡化這個更美化的方式?一個很好的方式來分割一個範圍在斯卡拉

var i = 0 
val step = 100 
val limitArr = new ArrayBuffer[(Int, Int)] 
while (i < rddPartNumber) { 
    limitArr += ((i, i + step)) 
    i += step 
} 
+0

感謝所有的答案,對不起,我只能接受一個! – Djvu

回答

3

你在做什麼基本上循環了一系列的數字。這可以通過映射在Range

val limits = (0 until rddPartNumber by step) map {i => (i , i + step)} 

表達或者如果你喜歡for語法

for {i <- 0 until rddPartNumber by step} 
yield (i, i + step) 
1

是這樣的嗎?

scala> val range = 0 to 444 by 100 
range: scala.collection.immutable.Range = inexact Range 0 to 444 by 100 

scala> (range zip range.tail).toArray 
res0: Array[(Int, Int)] = Array((0,100), (100,200), (200,300), (300,400)) 

444只是rddPartNumber的佔位符。

1

您可以使用範圍功能打造你想要的步長的列表,然後映射列表建元組:

val list = List.range(0, rddPartNumber, step) // List(0, 100, 200, 300, 400, 500, ...) 

val tuples = list.map(x => (x, x + step)) // List((0,100), (100,200), (200,300), (300,400), (400,500), (500,600) 

val array = tuples.toArray 
1
scala> val range = 0 to rddPartNumber by step 
scala> range.zip(range.tail) 

隨着step EQU人到100 rddPartNumber等於1000

res6: scala.collection.immutable.IndexedSeq[(Int, Int)] = Vector((0,100), (100,200), (200,300), (300,400), (400,500), (500,600), (600,700), (700,800), (800,900), (900,1000))

如果你真的需要一個Array,荏苒在一起後添加toArray

1

使用Array.tabulatea的間隔rddPartNumber如下

Array.tabulate((rddPartNumber-a)/step) { i => (i*step, i*step+step) }