在Scala中,如何使用forall循环来检查Vector中所有行的列数是否相同



所以我有一个通用向量:1:vec: Vector[Vector[T]]现在我想使用requirefor all来检查每行的长度是否相同。这就是我所取得的成就:2:require(vec.forall(row => data(row).length == ???)所以本质上我想确保每一行都有相同数量的列,我不想使用3:data(row + 1).length,因为在这种情况下我可能会使用for循环。有人能告诉我们如何解决代码2吗?

如果所有行的长度必须相同,则可以将每一行与其他行进行比较。

if (vec.size < 2) true  // vacuous
else {
val firstLength = data(vec.head).length
vec.forall(row => data(row).length == firstLength)
}

严格地说,forall中的第一个比较将始终为真,但Vector.tail可能比执行比较更多的工作;如果data(row).length特别昂贵,则使其成为

vec.tail.forall(...)

也许值得。

(如果我们处理的不是Vector,而是List,那么tail肯定比data(row).length便宜,尽管使用List可能会有其他注意事项(

考虑一个3x4矢量的矢量,例如

val xs = Vector.tabulate(3) { _ => Vector.tabulate(4) { _ =>  1 }}

Vector(Vector(1, 1, 1, 1), 
Vector(1, 1, 1, 1), 
Vector(1, 1, 1, 1))

收集每个嵌套向量的大小,

val s = xs.map {_.size}
// Vector(4, 4, 4)

现在,我们可以通过将Vector.forall与配对来比较连续尺寸

s.zip(s.drop(1))
// Vector((4,4), (4,4))

其中所述第一对对应于所述第一和第二向量大小,并且所述第二对对应于第二和第三向量大小;因此

s.zip(s.drop(1)).forall { case(a,b) => a == b }
// true

通过这种方法,我们可以在Vector.forall中定义其他谓词,例如单调递增对、

val xs = Vector(Vector(1), Vector(1,2), Vector(1,2,3))
val s = xs.map {_.size}
// Vector(1, 2, 3)
s.zip(s.drop(1))
// Vector((1,2), (2,3))
s.zip(s.drop(1)).forall { case(a,b) => a == b }
// false
s.zip(s.drop(1)).forall { case(a,b) => a < b }
// true

相关内容

  • 没有找到相关文章

最新更新