Scala-эквивалент java.util.ArrayList - PullRequest
62 голосов
/ 27 ноября 2011

Я делаю проект в Scala, но я довольно плохо знаком с языком и имею опыт работы с Java. Я вижу, что в Scala нет ArrayList, поэтому мне интересно, как называется Scala-эквивалент Java ArrayList и существуют ли какие-либо важные различия между версиями Java и Scala.

РЕДАКТИРОВАТЬ: Я не ищу конкретного поведения, а скорее внутреннего представления (данные хранятся в массиве, но весь массив не виден, только часть, которую вы используете).

Ответы [ 4 ]

106 голосов
/ 27 ноября 2011

Я могу придумать 3 более конкретных вопроса, чтобы ответить на ваш:

  • Что такое коллекция Scala по умолчанию?
  • Какая коллекция Scala имеет характеристики, аналогичные ArrayList?
  • Какая хорошая замена для Array в Scala?

Итак, вот ответы на эти вопросы:

Что такое коллекция Scala по умолчанию?

Эквивалентом Scala интерфейса Java List является Seq. Существует также более общий интерфейс - GenSeq - главное отличие в том, что GenSeq может иметь операции, обрабатываемые последовательно или параллельно, в зависимости от реализации.

Поскольку Scala позволяет программистам использовать Seq в качестве фабрики, они не часто задаются определением конкретной реализации, если не заботятся об этом. Когда они это сделают, они обычно выберут либо List, либо Vector Скалы. Они оба неизменны, и Vector имеет хорошую производительность индексированного доступа. С другой стороны, List очень хорошо выполняет операции, которые он делает хорошо.

Какая коллекция Scala имеет характеристики, аналогичные ArrayList?

Это было бы scala.collection.mutable.ArrayBuffer.

Какая хорошая замена для Array в Scala?

Что ж, хорошая новость в том, что вы можете просто использовать Array в Scala! В Java часто избегают Array из-за его общей несовместимости с обобщениями. Это ко-вариантная коллекция, в то время как дженерики инвариантны, они изменчивы - что делает их ковариацию опасной, она принимает примитивы там, где дженерики нет, и имеет довольно ограниченный набор методов.

В Scala Array - то же самое Array, что и в Java - является инвариантом, что устраняет большинство проблем. Scala принимает AnyVal (эквивалент примитивов) в качестве типов для своих «дженериков», даже если он будет выполнять автобокс. И благодаря шаблону «обогатить мою библиотеку» методы ALL из Seq доступны для Array.

Итак, если вы хотите более мощный Array, просто используйте Array.

А как насчет коллекции, которая уменьшается и растет?

Методы по умолчанию, доступные для всех коллекций, создают новые коллекции. Например, если я сделаю это:

val ys = xs filter (x => x % 2 == 0)

Тогда ys будет новой коллекцией, тогда как xs будет таким же, как и до этой команды. Это верно, независимо от того, что xs было: Array, List и т. Д.

Естественно, это имеет свою стоимость - в конце концов, вы производите новую коллекцию. Неизменяемые коллекции Scala намного лучше справляются с этой стоимостью, поскольку они постоянны , но это зависит от того, какая операция выполняется.

Ни одна коллекция не может многое сделать с filter, но List имеет отличную производительность при генерации новой коллекции путем добавления элемента или удаления заголовка - по сути, основных операций стека. Vector имеет хорошую производительность при выполнении множества операций, но платит только в том случае, если коллекция не маленькая. Для коллекций, скажем, до ста элементов, общая стоимость может превысить выигрыш.

Таким образом, вы можете добавлять или удалять элементы в Array, и Scala создаст для вас new Array, но при этом вы заплатите полную стоимость копии. .

Изменяемые коллекции Scala добавляют несколько других методов. В частности, коллекции, которые могут увеличивать или уменьшать размер - без создания новой коллекции - реализуют черты Growable и Shrinkable. Они не гарантируют хорошую производительность при этих операциях, но они укажут вам на коллекции, которые вы хотите проверить.

20 голосов
/ 27 ноября 2011

Это ArrayBuffer из scala.collection.mutable.Вы можете найти скальдок здесь .

0 голосов
/ 27 ноября 2011

Трудно точно сказать, что вы должны делать, потому что вы еще не сказали, какое поведение ArrayList вы хотите использовать.Полезнее думать о том, какими чертами скалы вы хотите воспользоваться.Вот хорошее объяснение: http://grahamhackingscala.blogspot.com/2010/02/how-to-convert-java-list-to-scala-list.html.

Тем не менее, вы, вероятно, хотите какой-то IndexedSeq.

0 голосов
/ 27 ноября 2011

Вы смотрели на ArraySeq?

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