Есть ли нехватка времени, какая-то техническая проблема или есть причина, почему она не должна существовать?
Почему в Scala нет измененного TreeMap?
Ответ 1
Это просто недостающий случай, который, предположительно, в конце концов будет заполнен. Нет причин не делать этого, и в некоторых случаях он будет значительно быстрее, чем неизменяемое дерево (так как модификации требуют создания объектов log (n) с помощью неизменяемое дерево и только 1 с изменяемым деревом).
Изменить: и на самом деле он был заполнен в 2.12.
(Существует также соответствующий Set
.)
Ответ 2
Между тем вы можете использовать Java TreeMap, что именно то, что вам нужно.
val m = new java.util.TreeMap[String, Int]()
m.put("aa", 2)
m.put("cc", 3)
Ответ 3
Я предполагаю, что причина в том, что наличие изменчивого варианта не приносит большой пользы. В других ответах есть некоторые случаи, когда изменчивая карта может быть более эффективной, например, при замене уже существующего значения: измененный вариант сохранит создание новых узлов, но сложность будет по-прежнему равна O (log n).
Если вы хотите сохранить общую ссылку на карту, вы можете использовать ImmutableMapAdaptor
, которая переносит любую неизменяемую карту в изменяемую структуру.
Ответ 4
Вы также заметите, что TreeSet
также не имеет изменяемого эквивалента. Это связано с тем, что они используют общий базовый класс RedBlack
, а базовая структура данных, которая хранит Trees
, упорядоченную элементами или ключами, красно-черное дерево. Я не слишком много знаю об этой структуре данных, но это довольно сложно (вставка и удаление довольно дороги по сравнению с другими Картами), поэтому я предполагаю, что это связано с изменением варианта, который не включен.
В принципе, вероятно, потому, что базовая структура данных не легко изменена, поэтому TreeMap
нет. Итак, чтобы ответить на ваш вопрос, это техническая проблема. Конечно, это можно сделать, но для этого просто мало пользы.
Ответ 5
Могут быть причины производительности для изменяемого TreeMap
, но обычно вы можете использовать неизменяемую карту так же, как и измененную. Вам просто нужно назначить его var
, а не val
. Он будет таким же, как и для HashMap
, который имеет изменяемые и неизменные варианты:
val mh = collection.mutable.HashMap[Int, Int]()
var ih = collection.immutable.HashMap[Int, Int]()
mh += (1 -> 2)
ih += (1 -> 2)
mh // scala.collection.mutable.HashMap[Int,Int] = Map(1 -> 2)
ih // scala.collection.immutable.HashMap[Int,Int] = Map(1 -> 2)