9
votes

Scala Insérer dans la liste à des emplacements spécifiques

C'est le problème que j'ai fait résoudre, mais étant un impératif total Scala noob, je sens que j'ai trouvé quelque chose de totalement non élégant. Toute idée d'amélioration appréciée.

var final:List[Any] = (0 /: indexes) {(final, i) => final ::: ins ::: l1.slice(i, indexes(i))


0 commentaires

3 Réponses :


14
votes
List(5 6 4) List(1) List(2) List(3) List(5 6 4)

4 commentaires

Travaux d'art;) Que veut dire le premier [a]? Que signifie?


Le premier [A] signifie qu'il s'agit d'une méthode générique (cela fonctionne sur certains caractères A ; le plus tard a S fait référence à la même chose. une). _ signifie "quelle que soit la variable"; C'est un raccourci pour x => x == 4 .


xs.map (..). Aplatissez peut être écrit comme xs.flatmap (..) .


@Landei - En effet. Je ne me souviens plus pourquoi je l'ai fait de cette façon; Peut-être que je pensais qu'il était plus clair d'expliquer? Je le laisserai comme ça, mais votre point est bien pris.



10
votes

Le truc aplu est mignon, je n'aurais pas pensé à utiliser carte code> ici moi-même. De mon point de vue, ce problème est une application typique d'un pli, comme vous le souhaitez passer par la liste et "Collecter" quelque chose (la liste de résultats). Comme nous ne voulons pas que notre liste de résultats à l'envers, flambight code> (A.k.a. : \ code>) est ici la version droite:

def insert[A](xs: List[A], extra: List[A])(p: A => Boolean) = 
  xs.foldRight(List[A]())((x,xs) => if (p(x)) extra ::: (x :: xs) else x :: xs)


0 commentaires

3
votes

Voici une autre possibilité, en utilisant SEQ # patch code> pour gérer les inserts réels. Vous devez vous replier de manière à ce que les indices ultérieurs soient traités d'abord (les insertions modifient les indices de tous les éléments après l'insertion, il serait donc délicat autrement).

def insert[A](xs: Seq[A], ys: Seq[A])(pred: A => Boolean) = {
  val positions = xs.zipWithIndex filter(x => pred(x._1)) map(_._2)
  positions.foldRight(xs) { (pos, xs) => xs patch (pos, ys, 0) }
}


0 commentaires