2017-06-17 3 views
0

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 

Répondre

2

Vous pouvez utiliser zipWithIndex avant sliding:

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) 
} 
+0

Merci pour cela. Que dois-je faire pour permettre au 'map' standard d'agir sur' smallArrayWithIndex.head' qui est '(Int, Int)'. –

+0

Je n'ai pas pu obtenir 'map' à résoudre, mais votre aide avec' zipWithIndex' m'a permis d'y arriver à la fin. Merci. –