2014-12-11 7 views
5

Библиотека библиотеки Scala имеет mapValues и filterKeys. Причина, по которой не mapKeys, вероятно, аспект производительности (в отношении HashMap реализации), как описано здесь Haskell: Why there's not mapKeys in Data.Hashmap?Почему нет mapKeys в Scala?

Однако.

Последствия, связанные с производительностью, я нуждаюсь в mapKeys не менее, чем mapValues, просто для массирования данных (т. Е. Я использую карту для абстракции данных, а не для ее скорости выборки).

Я ошибаюсь и какую модель данных вы бы использовали для этого? Кортеж?

+1

Если отображение ключей вызывает столкновение, какие значения вы ожидаете найти на новой карте? Первый, последний или совокупность всех значений с одним и тем же ключом? –

+0

Хорошая точка. В моем случае я не гарантировал бы никаких столкновений, но это говорит о том, сколько нужно учитывать при разработке библиотек коллекции. – akauppi

+0

@LeifWickland, то же самое, что и при отображении на 'Set' в Scala: оно может уменьшиться. –

ответ

10

Понятия не имею, почему это не в стандартной библиотеке, но вы можете легко сутенер свою библиотеку с неявным классом

implicit class MapFunctions[A, B](val map: Map[A, B]) extends AnyVal { 
    def mapKeys[A1](f: A => A1): Map[A1, B] = map.map({ case (a, b) => (f(a), b) }) 
    } 

    val m = Map(1 -> "aaa", 2 -> "bbb") 

    println(m.mapKeys(_ + 1)) 
2

Вы можете использовать scalaz:

import scalaz.Scalaz._ 

val m = Map(1 -> "aaa", 2 -> "bbb") 
m.mapKeys(_ + 1) 

В случае столкновения результат может быть меньше, чем исходная карта.

+0

Скалас похож на Boost для C++, и я не трогаю его по тем же причинам. – akauppi

+0

Согласен. И я думаю, что он должен служить также пулом идей для разработчиков компилятора scala. Я понятия не имею, почему они не считают их. Этот метод mapKeys - это яркий пример, который каждый разработчик ожидает в библиотеке коллекции. – mirelon

+0

@akauppi, что не так с Boost и Scalaz? –

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