2013-08-12 5 views
0

J'essaie d'implémenter un quicksort idiomatique in-situ en scala. Pour ce faire, je suis récursif sur les vues au lieu des paires d'index (gauche, droite). Cependant, je rencontre un problème en prenant une vue depuis une vue.Scala Array view 'flatmap'

Array(1, 2).view => IndexedSeqView[Int, Array[Int]] 
Array(1, 2).view.view => IndexedSeqView[Int, IndexedSeqView[Int, Array[Int]]] 

et ainsi de suite. Cela me laisse incapable de partitionner de façon récursive des vues de vues d'un tableau de base, car ma fonction récursive ne sait pas à quel type s'attendre. Existe-t-il un moyen de prendre des vues de sorte que la vue d'un IndexedSeqView [Int, Array [Int]] soit aussi une IndexedSeqView [Int, Array [Int]]?

Répondre

2

Il y a un certain nombre de fonctions de mutable.IndexedSeqView qui renvoient d'autres vues. Pour votre cas, je suppose que splitAt est ce que vous voulez.

Essayez de faire toute votre offre de portemanteau scala au IndexedSeqView s, puis fournissez un emballage pratique pour le tri Array s.

0

j'ai pu faire mon travail de fonction en tout état sur une séquence de Ints en remplaçant

def quickSort(arr: IndexedSeqView[Int, Array[Int]) 

avec

def quickSort(arr: IndexedSeqView[Int, _]). 

Mais je préférerais un mappage de fonction

IndexedSeqView[A, C[A]] 

à une certaine sous-vue

IndexedSeqView[A, C[A]] 

si une telle fonction existe