S-99 : P01

Leave a Comment

J'ai entrepris de résoudre les problèmes du "S-99: Ninety-Nine Scala Problems", histoire de faire du Scala et peut-être de confronter mes solutions avec celles de mes lecteurs. Donc n'hésitez pas à poster vos solutions en commentaires! J'espère qu'à la fin de cette série de problèmes mon cerveau pensera mieux Scala ;-)


Le problème

Il s'agit d'écrire une fonction qui retourne le dernier élément d'une liste d'entiers.
Exemple fourni par le site:

scala> last(List(1, 1, 2, 3, 5, 8))
res0: Int = 8


Les solutions

Voici ma première implémentation:

def last1[T](xs: List[T]) = xs match {
    case List() => None
    case _ => Some(xs(xs.size - 1))
  }
Vous aurez remarqué que je ne renvoie pas directement le résultat mais plutôt un objet Option.
Voici une deuxième implémentation, plus courte, qui utilise la méthode headOption qui renvoit une Option avec sur l'élément de tête d'une liste. Remarquez que j'inverse d'abord la liste.
def last2[T](xs: List[T]): Option[T] = xs.reverse headOption
Enfin la version récursive:
def recursiveLast[T](xs: List[T]): Option[T] = xs match {
    case Nil => None
    case head :: Nil => Some(head)
    case head :: tail => recursiveLast(tail)
  }


Les tests

Voici le test de mes fonctions avec Specs2:

import org.specs2.mutable._

class P01Spec extends Specification {
  "P01.last1()" should {
    "return Some(8)" in {
      P01.last1(List(1, 1, 2, 3, 5, 8)) must_== Some(8)
    }

    "return Some(3)" in {
      P01.last1(List(1, 2, 3)) must_== Some(3)
    }

    "return Some(2.5)" in {
      P01.last1(List(3.23, 2.4, 5.0, 2.5)) must_== Some(2.5)
    }

    "return None" in {
      P01.last1(List()) must_== None
    }

    "return None" in {
      P01.last1(Nil) must_== None
    }
  }

  "P01.last2()" should {
    "return Some(8)" in {
      P01.last2(List(1, 1, 2, 3, 5, 8)) must_== Some(8)
    }

    "return Some(3)" in {
      P01.last2(List(1, 2, 3)) must_== Some(3)
    }

    "return Some(2.5)" in {
      P01.last2(List(3.23, 2.4, 5.0, 2.5)) must_== Some(2.5)
    }

    "return None" in {
      P01.last2(List()) must_== None
    }

    "return None" in {
      P01.last2(Nil) must_== None
    }
  }

  "P01.recursiveLast()" should {
    "return Some(8)" in {
      P01.recursiveLast(List(1, 1, 2, 3, 5, 8)) must_== Some(8)
    }

    "return Some(3)" in {
      P01.recursiveLast(List(1, 2, 3)) must_== Some(3)
    }

    "return Some(2.5)" in {
      P01.recursiveLast(List(3.23, 2.4, 5.0, 2.5)) must_== Some(2.5)
    }

    "return None" in {
      P01.recursiveLast(List()) must_== None
    }

    "return None" in {
      P01.recursiveLast(Nil) must_== None
    }
  }
}
The END!!! Mais avant de partir sachez que l'API de List offre une méthode (last) pour récupérer le dernier élément d'une liste et une autre (lastOption) pour récupérer un objet Option du dernier élément.
Bye!

© Nouhoum TRAORE.. Fourni par Blogger.