Вы не можете использовать значения Map
, чтобы определить порядок по умолчанию для Карты.
TreeMap[A,B]
«s конструктор принимает неявный Ordering[A]
параметр, так что вы могли бы сделать что-то вроде этого:
// Will sort according to default Int ordering (ascending by numeric value)
scala> val tm = TreeMap(3 -> "c", 1 -> "a", 2 -> "b")
tm: scala.collection.immutable.TreeMap[Int,String] = Map(1 -> a, 2 -> b, 3 -> c)
// A wild implicit appears! (orders descending by numeric value)
scala> implicit val tmOrd = Ordering[Int].on((x:Int) => -x)
tmOrd: scala.math.Ordering[Int] = [email protected]
// Our implicit is implicitly (yeah) used by constructor
scala> val invTm = TreeMap(3 -> "c", 1 -> "a", 2 -> "b")
invTm: scala.collection.immutable.TreeMap[Int,String] = Map(3 -> c, 2 -> b, 1 -> a)
Обратите внимание, что безопаснее ограничить сферу implicits, как этот. Если это возможно, вы должны построить (неявный) объект и передать его вручную или отделить область неявного объявления от того места, где на него может повлиять другой код.
Причина в том, что TreeMap построен на вершине дерева, которое использует значения ключей для поддержания структурных ограничений, которые позволяют эффективно считывать/записывать данные на основе ключей, что является основной целью Карты. Заказ на значения на карте просто не имеет смысла.
Обновление: Сложность логики заказа ничего не значит. По вашему комментарию:
scala> object ComplexOrdering extends Ordering[Int] {
| def compare(a: Int, b: Int) = {
| if(a == 3) -1 else if(a == 2 * b) -1 else if(a == 3 * b) 0 else 1
| }
| }
defined object ComplexOrdering
scala> val tm = TreeMap(3 -> "c", 1 -> "a", 2 -> "b")
tm: scala.collection.immutable.TreeMap[Int,String] = Map(1 -> a, 2 -> b, 3 -> c)
scala> val tm = TreeMap(3 -> "c", 1 -> "a", 2 -> "b")(ComplexOrdering)
tm: scala.collection.immutable.TreeMap[Int,String] = Map(3 -> c, 2 -> b, 1 -> a)
Что делать, если я хочу сортировать с более сложной функцией? Например: '(x: Int, y: Int) => {if (x == 3) -1 else if (x == 2 * y) -1 else if (x == 3 * y) 0 else 1 } '. – qed
Пока вы сравниваете ключи, не имеет значения, насколько сложным является ваш заказ. Я покажу ответ, чтобы продемонстрировать это. – tkroman