所以我有一个通用向量:1:vec: Vector[Vector[T]]
现在我想使用require和for 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