如何跟踪 Array.sliding 中的索引

How to keep track of the index in an Array.sliding

在 Scala 中对 Array 使用 sliding 函数时,根据原始数组跟踪滑动子数组索引的正确方法是什么?

// Initialize some data
val bigArray = List(2, 3, 4, 2, 3, 6, 8, 4, 5).toArray
val n:Int = 5

// Slide through the big array
for (smallArray <- bigArray.sliding(n)) {
  val thirdValue:Int = smallArray(3)
  val k = (bigArray zip smallArray) lastIndexWhere { case (x, y) => x < y }
  if (bigArray(k+1) >= thirdValue) {
    println(bigArray.toList.toString + 
      " has "
      + bigArray(k+1)
      + " >= " 
      + thirdValue 
      + " in "
      + smallArray.toList.toString
      + " at index "
      + k+1)
  }

现在我知道

val k = (bigArray zip smallArray) lastIndexWhere { case (x, y) => x < y }

不正确。根据原始 bigArray 跟踪 smallArray 位置的正确方法是什么?

我得到的是

List(2, 3, 4, 2, 3, 6, 8, 4, 5) has 2 >= 2 in List(2, 3, 4, 2, 3) at index -11
List(2, 3, 4, 2, 3, 6, 8, 4, 5) has 6 >= 3 in List(3, 4, 2, 3, 6) at index 41
List(2, 3, 4, 2, 3, 6, 8, 4, 5) has 6 >= 6 in List(4, 2, 3, 6, 8) at index 41
List(2, 3, 4, 2, 3, 6, 8, 4, 5) has 6 >= 4 in List(3, 6, 8, 4, 5) at index 41

我需要

List(2, 3, 4, 2, 3, 6, 8, 4, 5) has 6 >= 2 in List(2, 3, 4, 2, 3) at index 5
List(2, 3, 4, 2, 3, 6, 8, 4, 5) has 8 >= 3 in List(3, 4, 2, 3, 6) at index 6

更新

我无法让 map 与接受的答案中来自 headtuple2(Int, Int) 一起工作,但是 zipWithIndex 的提及让我到达了那里,所以我接受了有用的答案。这就是我最终得到的:

for (zipArray <- bigArray.slice(0, bigArray.length - 1).zipWithIndex.sliding(n)) {
  val j = zipArray.head._2
  val k = zipArray.last._2
  val smallArray = bigArray.slice(j, k)
  val thirdValue:Int = smallArray(3)
  if (bigArray(k+1) >= thirdValue) {
    println(bigArray.toList.toString +
      " has "
      + bigArray(k+1)
      + " >= "
      + thirdValue
      + " in "
      + smallArray.toList.toString
      + " at index "
      + (k+1) )
  }
}

产生:

List(2, 3, 4, 2, 3, 6, 8, 4, 5) has 6 >= 2 in List(2, 3, 4, 2) at index 5
List(2, 3, 4, 2, 3, 6, 8, 4, 5) has 8 >= 3 in List(3, 4, 2, 3) at index 6

你可以在sliding之前使用zipWithIndex:

for (smallArrayWithIndex <- bigArray.zipWithIndex.sliding(n)) {
    val startingIndex = smallArrayWithIndex.head.map { case (_, index) => index }
    val smallArray = smallArrayWithIndex.map { case (e, _) => e }
    println("smallArray starts at index " + index + " and contains " + smallArray)
}