Почему в Scala нет изменяемого TreeMap? - PullRequest
38 голосов
/ 26 декабря 2010

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

Ответы [ 5 ]

27 голосов
/ 26 декабря 2010

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


Редактировать: и фактически оно было заполнено в 2.12.

Изменяемая карта дерева .

(также существует соответствующий Set.)

6 голосов
/ 23 октября 2012

Я предполагаю, что причина в том, что наличие изменчивого варианта не приносит большой пользы. В других ответах упоминается несколько случаев, когда изменяемая карта может быть немного более эффективной, например, при замене уже существующего значения: изменяемый вариант сохранит создание новых узлов, но сложность все равно будет O ( log n) .

Если вы хотите сохранить общую ссылку на карту, вы можете использовать ImmutableMapAdaptor, которая превращает любую неизменяемую карту в изменяемую структуру.

6 голосов
/ 23 февраля 2012

Тем временем вы можете использовать Java TreeMap, который именно то, что вам нужно.

val m = new java.util.TreeMap[String, Int]()
m.put("aa", 2)
m.put("cc", 3)
2 голосов
/ 26 декабря 2010

Вы также заметите, что TreeSet также не имеет изменяемого эквивалента. Это потому, что они имеют общий базовый класс RedBlack, а базовая структура данных, в которой Trees упорядочен по элементам или ключам, представляет собой красно-черное дерево . Я не знаю слишком много об этой структуре данных, но она довольно сложна (вставка и удаление довольно дороги по сравнению с другими Картами), поэтому я предполагаю, что это как-то связано с отсутствием изменяемого варианта.

По сути, это возможно потому, что базовая структура данных не является легко изменяемой, поэтому TreeMap - нет. Итак, чтобы ответить на ваш вопрос, это техническая проблема. Это, безусловно, можно сделать, но для этого не так много вариантов использования.

1 голос
/ 15 февраля 2012

Могут быть причины производительности для изменяемого 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)
...