Ответ 1
Для читателей, которые посещают этот старый вопрос: в разделе документации Конкретные сборные классы классов содержится обзор изменчивых классов списка, включая объяснения, когда использовать какой.
Это дополнительный вопрос к изменяемому списку No Scala
Я хочу использовать изменяемый список в Scala. Я могу выбрать из
scala.collection.mutable.DoubleLinkedList
scala.collection.mutable.LinkedList
scala.collection.mutable.ListBuffer
scala.collection.mutable.MutableList
Что хорошо, но каков "стандартный", рекомендуемый, идиоматический способ скалы? Я просто хочу использовать список, к которому я могу добавить вещи на обороте.
В моем случае я использую HashMap, где "списки" (я имею в виду это в общем смысле) будут на стороне значения. Затем я читаю что-то из файла и для каждой строки хочу найти правильный список в хэш-карте и добавить значение в список.
Для читателей, которые посещают этот старый вопрос: в разделе документации Конкретные сборные классы классов содержится обзор изменчивых классов списка, включая объяснения, когда использовать какой.
Зависит от того, что вам нужно.
DoubleLinkedList
- связанный список, который позволяет вам перемещаться назад и вперед через список узлов. Используйте ссылки prev
и next
для перехода к предыдущему или следующему node, соответственно.
LinkedList
является односвязным списком, поэтому нет указателей prev
- если вы все время переходите к следующему элементу списка, это то, что вам нужно.
РЕДАКТИРОВАТЬ: Обратите внимание, что два вышеупомянутых предполагается использовать внутри как строительные блоки для более сложных структур списка, таких как MutableList
, которые поддерживают эффективное добавление, и mutable.Queue
s.
В двух сборках, приведенных выше, есть операции добавления в виде линейного времени.
ListBuffer
- класс буфера. Несмотря на то, что он поддерживается структурой данных с одиночной привязкой, он не отображает указатель next
для клиента, поэтому вы можете перемещаться только с помощью итераторов и foreach
.
Его основное использование, однако, является буфером и непременным редактором списков - вы добавляете к нему элементы через +=
, а когда вы вызываете result
, вы очень эффективно возвращаете функциональный immutable.List
. В отличие от изменяемых и неизменяемых списков, операции append и prepend являются постоянными - вы можете добавить в конце через +=
очень эффективно.
MutableList
используется внутренне, вы обычно не используете его, если только вы не планируете внедрять собственный класс коллекций на основе структуры данных с одиночной привязкой. Переменные очереди, например, наследуют этот класс. Класс MutableList
также имеет эффективную операцию добавления константы времени, поскольку он поддерживает ссылку на последний node в списке.
Если вы хотите добавить элементы, вы не должны использовать List
вообще. List
хороши, если вы хотите добавить элементы. Вместо этого используйте ArrayBuffer
.
Я просто хочу использовать список, который я могу добавить на него.
Затем выберите то, что реализует Growable
. Я лично предлагаю одну из реализаций Buffer
.
Я держусь в стороне от LinkedList
и DoubleLinkedList
, поскольку они присутствуют главным образом в качестве основной реализации других коллекций, но имеют довольно много ошибок до Scala 2.9.x. Начиная с Scala 2.10.0, я ожидаю, что различные исправления ошибок приведут их к стандартному. Тем не менее, им не хватает ожидаемых методов, например +=
, которые вы найдете в коллекциях на их основе.