2013-07-05 3 views
7

リストオブジェクトをスカラーで並べ替え、リスト内の要素をソートしないでください。私はint型の二つのリストがある場合たとえば:リスト[Int]オブジェクトをスカラでソートするにはどうすればよいですか?

val l1 = List(1, 2, 3, 7) 
val l2 = List(1, 2, 3, 4, 10) 

を私は順序L1> L2でそれらを置くことができるようにしたいです。

私はそれが必要なことをするケースクラスを作成しましたが、問題を使用するときは他のメソッドは動作しません。クラス内の他のすべてのメソッド、つまりflatten、sortWithなどを実装する必要がありますか?

私のクラスのコードは次のようになります。

class ItemSet(itemSet: List[Int]) extends Ordered[ItemSet] { 

    val iSet: List[Int] = itemSet 

    def compare(that: ItemSet) = { 

    val thisSize = this.iSet.size 
    val thatSize = that.iSet.size 
    val hint = List(thisSize, thatSize).min 
    var result = 0 
    var loop = 0 

    val ths = this.iSet.toArray 
    val tht = that.iSet.toArray 

    while (loop < hint && result == 0) { 
     result = ths(loop).compare(tht(loop)) 
     loop += 1 
    } 
    if (loop == hint && result == 0 && thisSize != thatSize) { 
     thisSize.compare(thatSize) 
    } else 
     result 
    } 

} 

を今、私はアイテムセットの配列を作成する場合、私はそれを並べ替えることができます。

val is1 = new ItemSet(List(1, 2, 5, 8)) 
val is2 = new ItemSet(List(1, 2, 5, 6)) 
val is3 = new ItemSet(List(1, 2, 3, 7, 10)) 

Array(is1, is2, is3).sorted.foreach(i => println(i.iSet)) 

scala> List(1, 2, 3, 7, 10) 
List(1, 2, 5, 6) 
List(1, 2, 5, 8) 

私に問題を与えている2つの方法がある:

def itemFrequencies(transDB: Array[ItemSet]): Map[Int, Int] = transDB.flatten.groupBy(x => x).mapValues(_.size) 

エラーは次のとおりです。

タイプマップ[何も、INT]の

発現が期待されるタイプマップ[INT、INT]

に準拠していないと、この1のために:

def sortListAscFreq(transDB: Array[ItemSet], itemFreq: Map[Int, Int]): Array[List[Int]] = { 
    for (l <- transDB) yield 
    l.sortWith(itemFreq(_) < itemFreq(_)) 
} 

私が取得:

は、シンボルを解決できませんsortWith。

List [Int]を拡張して他のメソッドの機能を失うことなくリストをソートできる方法はありますか?

答えて

14

標準ライブラリは、注文品の収集にa lexicographic orderingを提供しています。あなたがスコープにそれを置くことができ、あなたが行われている:

scala> import scala.math.Ordering.Implicits._ 
import scala.math.Ordering.Implicits._ 

scala> val is1 = List(1, 2, 5, 8) 
is1: List[Int] = List(1, 2, 5, 8) 

scala> val is2 = List(1, 2, 5, 6) 
is2: List[Int] = List(1, 2, 5, 6) 

scala> val is3 = List(1, 2, 3, 7, 10) 
is3: List[Int] = List(1, 2, 3, 7, 10) 

scala> Array(is1, is2, is3).sorted foreach println 
List(1, 2, 3, 7, 10) 
List(1, 2, 5, 6) 
List(1, 2, 5, 8) 

Ordering type classがしばしばでOrderedよりも便利であるスカラ座、それはあなたがそのコードを変更したり、作成することなく、既存のいくつかのタイプを注文する方法を指定することができますプロキシクラスはOrdered[Whatever]まで拡張されています。

+0

ありがとうございました!私はちょうど2日を働かせようと努力したことを信じることができません。 –

+0

@Val、それは皮肉なことだと思いますが、ポイントの欠落があります。リストの_array_は '.sorted'を呼び出す前にソートされていません。また、私はOPの例を使用しています。これは一般的には良い考えです。 –

関連する問題