Подтвердить что ты не робот

Scala эквивалент java.util.ArrayList

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

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

4b9b3361

Ответ 1

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

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

Итак, вот ответы на них:

Что такое Scala сбор по умолчанию?

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

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

В коллекции Scala есть характеристики, похожие на ArrayList?

Это будет scala.collection.mutable.ArrayBuffer.

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

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

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

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

Как насчет коллекции, которая сжимается и растет?

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

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

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

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

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

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

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

Ответ 2

Это ArrayBuffer от scala.collection.mutable. Здесь вы можете найти scaladocs .

Ответ 3

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

Ответ 4

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

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