Почему в Scala нет измененного TreeMap?

Есть ли нехватка времени, какая-то техническая проблема или есть причина, почему она не должна существовать?

Ответ 1

Это просто недостающий случай, который, предположительно, в конце концов будет заполнен. Нет причин не делать этого, и в некоторых случаях он будет значительно быстрее, чем неизменяемое дерево (так как модификации требуют создания объектов log (n) с помощью неизменяемое дерево и только 1 с изменяемым деревом).


Изменить: и на самом деле он был заполнен в 2.12.

Mutable TreeMap.

(Существует также соответствующий 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)