2

キーの長さでスカラ マップを並べ替えたい。マップは次のようになります。

val randomMap = Map("short" -> "randomVal1", "muchlonger" -> "randomVal2")

randomMap を並べ替えて、反復するときに最初に最も長いキーから開始するようにしたいので、最初に「はるかに長い」要素を反復する必要があります。

4

2 に答える 2

3

キーと値のペアのシーケンスに変換し、並べ替え条件を適用します。例えば。:

randomMap.toSeq.sortBy(_._1.length).reverse

(デフォルトでは最短から最長でソートされるため、逆になります)。

于 2013-09-06T03:13:50.523 に答える
1

1 つのオプションは、 のカスタム順序を定義することTreeMapです。TreeMapのソートされた実装ですMap

import scala.collection.immutable.TreeMap

implicit object LengthOrder extends Ordering[String] { 
    def compare(s1: String, s2: String) = s1.length - s2.length 
}

val randomMap = TreeMap("111" -> "111", "1" -> "1", "11" -> "11")

//randomMap: TreeMap[String,String] = Map(1 -> 1, 11 -> 11, 111 -> 111)

val keys = randomMap.keys
//keys: Iterable[String] = Set(1, 11, 111)

これは、 がスコープ内にあるすべてTreeMap[String]の に影響することに注意してください。プロジェクトでは、別LengthOrderのプロジェクトに入れ子にする(または独自のパッケージに入れる) ことができ、それを必要とする特定のコード ブロック内にのみインポートできます。LengthOrderobject


編集:

@Bharadwaj は、これが同じ長さの 1 つのキーを除くすべてのキーをどのように破壊するかについて良い点を指摘しました。この問題を修正するには、次のようにします。

implicit object LengthOrder extends Ordering[String] { 
    def compare(s1: String, s2: String) = s1.length - s2.length match {
      case 0 => s1.compareTo(s2)
      case x => x
    }
}
于 2013-09-06T09:20:21.553 に答える