2011-07-13 3 views
21

Si j'ai une liste de Ints comme:Convertir Liste des Ints à SortedSet à Scala

val myList = List(3,2,1,9)

quel est le chemin droit/préféré pour créer un SortedSet à partir d'une liste ou Seq de Ints, où les articles sont triés du moins au plus grand?

Si vous déteniez une arme à feu à ma tête, j'aurais dit:

val itsSorted = collection.SortedSet(myList)

mais je reçois une erreur concernant qu'il n'y a pas d'ordre implicite défini pour la liste [Int].

Répondre

35

Utilisation:

collection.SortedSet(myList: _*) 

La façon dont vous l'avez utilisé, le compilateur pense que vous voulez créer un SortedSet[List[Int]] pas SortedSet[Int]. C'est pourquoi il ne se plaint d'aucune commande implicite pour List[Int].

Indication du paramètre répété de type A* dans la signature de la méthode:

def apply [A] (elems: A*)(implicit ord: Ordering[A]): SortedSet[A] 

Pour traiter myList comme argument de séquence de A utilisation, l'annotation de type _*.

+0

J'avais espéré que appliquer avait une surcharge pour prendre une collection/itérable de type x. Avec le recul, comment le pourrait-il. Je ne lui ai pas dit quel type de SortedSet je veux. – Andy

7

Il ne semble pas y avoir un constructeur qui accepte directement List (corrigez-moi si je me trompe). Mais vous pouvez facilement écrire

val myList = List(3,2,1,9) 
val itsSorted = collection.SortedSet.empty[Int] ++ myList 

dans le même effet. (Voir http://www.scala-lang.org/docu/files/collections-api/collections_20.html.)

+0

C'est la solution que j'ai finalement trébuché plus tôt. Cela ne semble pas idiomatique :) – Andy

+0

Belle solution, évite le besoin d'introduire explicitement un ordre implicite. Je pense que ce n'est pas que la solution n'est pas idiomatique car la bibliothèque de collections scala ne fournit pas au développeur une API idiomatique. Ce qui est plutôt malheureux pour scala. – matanster

2

Ceci est particulièrement utile si vous devez mapper de toute façon:

import scala.collection.breakOut 

val s: collection.SortedSet[Int] = List(1,2,3,4).map(identity)(breakOut) 
//--> s: scala.collection.SortedSet[Int] = TreeSet(1, 2, 3, 4) 
8

Vous pouvez également profiter de l'instance CanBuildFrom, et faire ceci:

val myList = List(3,2,1,9) 
myList.to[SortedSet] 
// scala.collection.immutable.SortedSet[Int] = TreeSet(1, 2, 3, 9) 
Questions connexes