2011-07-13 11 views
21

私のようなintのリストを持っている場合:int型のリストまたは配列からにSortedSetを作成するには、右/好ましい方法は何であるか変換一覧

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

アイテムは最小から最大までソートされますか?あなたが私の頭に銃を保持していた場合

は、私が言っているだろう:

val itsSorted = collection.SortedSet(myList)

が、私はエラーがリスト[INT]について定義された暗黙の秩序が存在しないことについて取得します。

答えて

35

用途:あなたはそれを使用し

collection.SortedSet(myList: _*) 

方法、コンパイラはあなたがSortedSet[List[Int]]ないSortedSet[Int]を作成したいと考えています。だからこそ、List[Int]の暗黙の注文について不平を言うのです。 A使用の配列引数、_*型注釈としてmyListを治療するために

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

お知らせ方法の署名を入力A*の繰り返しパラメーター。

+0

私は、適用がx型のコレクション/ iterableをとるためのオーバーロードを望むことを望んでいました。後見人ではどうしたらいい?私はそれがどのようなSortedSetのタイプを必要としているかについては言及していません。 – Andy

7

Listを直接受け入れるコンストラクタがないようです(私が間違っていれば私を修正してください)。しかし簡単に書くことができます

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

同じ効果。 (http://www.scala-lang.org/docu/files/collections-api/collections_20.htmlを参照してください。)

+0

これは私が最終的につまずいたソリューションです。より早くそれだけでは慣れない気がしません:) – Andy

+0

良い解決策は、暗黙の順序を明示的に持ち込む必要を避けます。私は、スケーラコレクションライブラリが開発者に慣用的なAPIを提供していないので、解決策は慣用的ではないとは思わない。スカラにとってはどちらかといえば不幸です。 – matanster

2

これはとにかくマッピングする必要がある場合に特に有用です:

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

をあなたはまたCanBuildFromインスタンスを活用して、これを行うことができます:

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