Scala: Какой самый эффективный способ конвертировать Map [K, V] в IntMap [V]? - PullRequest
4 голосов
/ 06 марта 2011

Допустим, у меня есть класс Point с методом toInt, и у меня есть неизменный Map[Point,V] для некоторого типа V. Какой самый эффективный способ в Scala преобразовать его в * 1004?*? Вот моя текущая реализация:

def pointMap2IntMap[T](points: Map[Point,T]): IntMap[T] = {
    var result: IntMap[T] = IntMap.empty[T]
    for(t <- points) {
        result += (t._1.toInt, t._2)
    }
    result
}

[EDIT] Я имел в виду, прежде всего, быстрее , но мне также были бы интересны более короткие версии, даже если они явно не быстрее.1010 *

Ответы [ 2 ]

4 голосов
/ 06 марта 2011

IntMap имеет встроенный заводской метод (apply) для этого:

IntMap(points.map(p => (p._1.toInt, p._2)).toSeq: _*)

Если скорость является проблемой, вы можете использовать:

points.foldLeft(IntMap.empty[T])((m, p) => m.updated(p._1.toInt, p._2))
1 голос
/ 06 марта 2011

Один вкладыш, который использует breakOut для получения IntMap.Он создает map для новой коллекции, используя фабрику пользовательских компоновщиков CanBuildFrom, в которой разрешается вызов breakOut:

Map[Int, String](1 -> "").map(kv => kv)(breakOut[Map[Int, String], (Int, String), immutable.IntMap[String]])

С точки зрения производительности трудно сказать, но он создаетnew IntMap, проходит через все привязки и добавляет их к IntMap.Рукописный цикл итератора while (которому предшествует сопоставление с шаблоном для проверки, является ли исходная карта IntMap), возможно, приведет к несколько большей производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...