Scala эквивалент java.утиль.список ArrayList


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

EDIT: Я не ищу конкретное поведение, а внутреннее представление (данные хранятся в массиве, но весь массив не виден, только часть вас использовать.)

4 58

4 ответа:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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