Lorsque vous utilisez une fonction sliding
sur un Array
dans scala, quelle est la manière correcte de suivre l'index du sous-tableau glissant en termes de tableau original?Comment conserver l'index dans un 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)
}
Maintenant, je sais que
val k = (bigArray zip smallArray) lastIndexWhere { case (x, y) => x < y }
est incorrect. Quelle est la bonne façon de suivre où est le smallArray
par rapport à l'original bigArray
?
Ce que je veux est
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
et j'ai besoin
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
Mise à jour
Je ne pouvais pas map
à travailler avec le tuple2(Int, Int)
qui venait de head
en la réponse acceptée, mais la mention de zipWithIndex
m'a eu là, donc J'ai accepté la réponse utile. C'est ce que j'ai fini avec:
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))
}
}
qui donne:
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
Merci pour cela. Que dois-je faire pour permettre au 'map' standard d'agir sur' smallArrayWithIndex.head' qui est '(Int, Int)'. –
Je n'ai pas pu obtenir 'map' à résoudre, mais votre aide avec' zipWithIndex' m'a permis d'y arriver à la fin. Merci. –