使用矢量[向量[INT]]參考v以及表達找到給定數量NUM:如何捕獲索引中的內部匹配值向量表達式?
val posX = v.indexWhere(_.indexOf(num) > -1)
是否有任何的方式來捕捉_.indexOf(NUM)的值後的使用表達式(即posY值)?下面的信號錯誤「簡單表達非法的開始」:
val posX = v.indexWhere((val posY = _.indexOf(num)) > -1)
使用矢量[向量[INT]]參考v以及表達找到給定數量NUM:如何捕獲索引中的內部匹配值向量表達式?
val posX = v.indexWhere(_.indexOf(num) > -1)
是否有任何的方式來捕捉_.indexOf(NUM)的值後的使用表達式(即posY值)?下面的信號錯誤「簡單表達非法的開始」:
val posX = v.indexWhere((val posY = _.indexOf(num)) > -1)
有很多不錯的功能的方式來做到這一點。以下是可能的更簡潔之一:
val v = Vector(Vector(1, 2, 3), Vector(4, 5, 6), Vector(7, 8, 9))
val num = 4
val Some((posY, posX)) = v.map(_ indexOf num).zipWithIndex.find(_._1 > -1)
// posY: Int = 0
// posX: Int = 1
注意,有很多額外的工作會在這裏,但是 - 我們創造了幾個中間集合,其中有一部分,我們並不需要,等等。如果你很多或者非常大的集合中調用了這個東西,那麼不幸的是你可能需要採取一個更爲強制性的方法。在這種情況下,我建議捆綁了所有的不愉快:
def locationOf(v: Vector[Vector[Int]])(num: Int): Option[(Int, Int)] = {
var i, j = 0
var found = false
while (i < v.size && !found) {
j = 0
while (j < v(i).size && !found)
if (v(i)(j) == num) found = true else j += 1
if (!found) i += 1
}
if (!found) None else Some(i, j)
}
不優雅,但這種方法很可能將是一個很大更快,更高效的內存。它足夠小,它不可能包含任何這種編程很容易出現的錯誤,並且它是引用透明的 - 所有的突變都是局部的。
從我的扶手椅,
scala> val v = Vector(Vector(1, 2, 3), Vector(4, 5, 6), Vector(7, 8, 9))
scala> v.zipWithIndex collectFirst {
| case (e, i) if (e indexOf num) >= 0 =>
| (i, e indexOf num)
| }
res7: Option[(Int, Int)] = Some((1,0))
我沒有做過的扶手椅數學,但相比特拉維斯的這一個中間集合。但請參閱特拉維斯的評論,即結果內部指數在這裏計算兩次,整個過程並非如此。
您可以在'.zipWithIndex'之前添加'.view'來獲得0箇中間集合。 – senia 2013-05-12 04:47:17
請注意,這通過搜索每個內部向量兩次來保存中間集合('e indexOf num')。 – 2013-05-12 10:25:32
如果我們不介意使用一個變量,然後我們可以在一個VAR捕捉內向量的indexOf()
值(_
在下面的代碼),後來用它來構建y位置:
val posX = v.indexWhere(_.indexOf(num) > -1)
val posY = v(posX).indexOf(num)
這裏這個解決方案只會在找到需要的元素之前進行評估。我個人認爲它更具可讀性,您可以在各種程序中重複使用它。如果需要的話,你顯然可以做得更一般。
val v = Vector(Vector(1, 2, 3), Vector(4, 5, 6))
def findElem(i: Int, vs: Vector[Vector[Int]]): (Int, Int) =
(for {
row <- vs.indices.toStream
col <- vs(row).indices.toStream
if vs(row)(col) == i
} yield (row, col)).head
findElem(5, v) // (1, 1)
,如果你想所有的位置,您可以刪除.toStream
方法。使用.toStream
僅意味着您只會評估到第一次出現爲止。
你好,來自Scala的函數式編程課程! :) – 2014-10-29 05:01:28