Это запись в блоге, изначально написанная в середине мая 2014 года. Кажется, я также пишу этот код каждые 3 месяца или около того, а потом забыла. Поэтому мне нужен триггер, чтобы точно запомнить, как работает Scala Maps, и сортировать записи по ключу.
Давайте разберемся с Scala REPL.
1
2
3
|
Welcome to Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_51). Type in expressions to have them evaluated. Type :help for more information. |
Мы создадим карту коллекции String, связанной с элементами Integer. Эти данные могли бы стать хранилищем ключевых значений, или у вас может быть аналогичное требование для работы со статистическими данными.
1
2
|
scala> val map = Map( "Jane" -> 3 , "Peter" -> 10 , "Steve" -> 1 , "Anna" -> 5 , "Megan" -> 15 , "Brian" -> 7 , "Sally" -> 8 ) map : scala.collection.immutable.Map[String,Int] = Map(Megan -> 15 , Anna -> 5 , Jane -> 3 , Brian -> 7 , Steve -> 1 , Sally -> 8 , Peter -> 10 ) |
Чтобы отсортировать структуру данных, мы затем преобразовываем карту в список наборов кортежей.
1
2
|
scala> map.toList res 1 : List[(String, Int)] = List((Megan, 15 ), (Anna, 5 ), (Jane, 3 ), (Brian, 7 ), (Steve, 1 ), (Sally, 8 ), (Peter, 10 )) |
Теперь мы можем сортировать, используя кортежи. Вот порядок убывания значений:
1
2
|
scala> map.toList.sortWith( (x,y) = > x. _ 2 > y. _ 2 ) res 2 : List[(String, Int)] = List((Megan, 15 ), (Peter, 10 ), (Sally, 8 ), (Brian, 7 ), (Anna, 5 ), (Jane, 3 ), (Steve, 1 )) |
Здесь порядок возрастания значений
1
2
|
scala> map.toList.sortWith( (x,y) = > x. _ 2 < y. _ 2 ) res 3 : List[(String, Int)] = List((Steve, 1 ), (Jane, 3 ), (Anna, 5 ), (Brian, 7 ), (Sally, 8 ), (Peter, 10 ), (Megan, 15 )) |
Вот еще один совет. Допустим, вам нужно создать гистограмму из 100 различных товаров. Вы можете создать эту структуру данных
неизменным в начале. Однако, поскольку вы строите статистику, вы можете вместо этого использовать изменяемую карту коллекции.
1
2
|
val buckets = collection.mutable.Map.empty[Int,Int] buckets ++ = ( 1 to 100 ).toList.map{ x = > (x, 0 ) }.toMap |
Теперь в вашей части сбора статистики вы можете написать что-то вроде этого:
1
2
3
|
val keyName : String = ??? val keyIndex : Integer = convertNameToIndex(keyName) buckets(keyIndex) = buckets.getOrElse(keyIndex, 0 ) + 1 |
А затем визуализировать отсортированные данные в десятку лучших продуктов
1
2
|
val sortedProducts = buckets.toList.sortWith{ (x,y) = > x. _ 2 > y. _ 2 } println(sortedProducts.take( 10 )) |
Это все.
Ссылка: | Scala Maps and Sorting от нашего партнера JCG Питера Пилигрима в блоге Питера Пилигрима . |