假设我有下面的代码,有没有什么办法来简化这个更美化的方式?一个很好的方式来分割一个范围在斯卡拉
var i = 0
val step = 100
val limitArr = new ArrayBuffer[(Int, Int)]
while (i < rddPartNumber) {
limitArr += ((i, i + step))
i += step
}
假设我有下面的代码,有没有什么办法来简化这个更美化的方式?一个很好的方式来分割一个范围在斯卡拉
var i = 0
val step = 100
val limitArr = new ArrayBuffer[(Int, Int)]
while (i < rddPartNumber) {
limitArr += ((i, i + step))
i += step
}
你在做什么基本上循环了一系列的数字。这可以通过映射在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)
是这样的吗?
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
的占位符。
您可以使用范围功能打造你想要的步长的列表,然后映射列表建元组:
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
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
。
使用Array.tabulate
从a
的间隔rddPartNumber
如下
Array.tabulate((rddPartNumber-a)/step) { i => (i*step, i*step+step) }
感谢所有的答案,对不起,我只能接受一个! – Djvu