2015-04-22 4 views
2

Я новичок Scala. Я ищу, чтобы создать класс в Scala с двумя изменяемыми SortedMap с, один в обычном порядке сортировки (увеличение) и один в обратном порядке сортировки (убывающую)Scala класс с SortedMap и "reverseed" SortedMap

class MyClass { 
    var mapNormal : SortedMap[Int, Int] = SortedMap.empty 
    var mapReversed : ??? = SortedMap.empty 
} 

var x = new MyClass 
x.mapNormal += (1 -> 50) 
x.mapReversed += (2 -> 51) 

Как я могу сделать это в Scala?

ответ

4

Если вы посмотрите на API docs for SortedMap, вы обнаружите, что SortedMap.empty[A] принимает неявный Ordering[A]. Это означает, что вы можете вызвать метод, как вы делали, и есть неявное автомагически разрешен (для упорядочения по умолчанию для Int, который является только то, что вы могли бы подумать, что это), или вы можете предоставить явное упорядочение:

class MyClass { 
    var mapNormal : SortedMap[Int, Int] = SortedMap.empty 
    var mapReversed : SortedMap[Int, Int] = SortedMap.empty(mapNormal.ordering.reverse) 
} 

Неявный порядок для Int определен в сопутствующем объекте scala.math.Ordering вместе с другими порядками по умолчанию, на случай, если вам интересно.

2

К сожалению, у scala нет измененной сортированной карты (например, TreeMap), поэтому вы можете использовать только неизменяемую версию.

Если вам нужно в обратном порядке на второй карте вам нужно поставщика обратного заказа параметр

// Key ordering 
    implicit val Ord = implicitly[Ordering[Int]] 

    val map = SortedMap.empty[Int, Int] 
    val reversedMap = SortedMap.empty[Int, Int](Ord.reverse) 

    println(map + (1 -> 50, 2 -> 51)) 
    println(reversedMap + (1 -> 50, 2 -> 51)) 

Выход:

Map(1 -> 50, 2 -> 51) 
Map(2 -> 51, 1 -> 50) 
+0

Как насчет scala.collection.SortedMap? Я думал, что он изменен в отличие от scala.collection.immutable.SortedMap. – Lazylabs

+0

Если вы проверите код, вы увидите, что он вызывает неизменяемую версию: «def empty [A, B]: SortedMap [A, B] = immutable.SortedMap.empty [A, B]) ' –

Смежные вопросы