所以我有一個通用向量: 1:vec: Vector[Vector[T]]
現在我想使用require和forall來檢查每行的長度是否相同。這是我已經走了多遠: 2:require(vec.forall(row => data(row).length == ???)
所以基本上我想確保每一行都有相同的列數,我不想使用 3:data(row 1).length因為在這種情況下我可能會使用 for 回圈。任何人都可以提供有關如何解決代碼 2 的提示嗎?
uj5u.com熱心網友回復:
如果所有行的長度必須相同,您可以將每一行與任何其他行進行比較。
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(...)
可能是值得的。
(如果不是 a Vector,我們處理的是 a List,tail絕對比 便宜data(row).length,盡管其他使用注意事項List可能適用)
uj5u.com熱心網友回復:
考慮一個 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/347929.html
