Сортировать ArrayBuffer [A] в scala? - PullRequest
       10

Сортировать ArrayBuffer [A] в scala?

4 голосов
/ 23 декабря 2009

У меня есть массив в Scala с классом ArrayBuffer[Actor], где Actor - это класс, который реализует черту Ordered[Actor]. Как отсортировать этот массив, не кодируя его вручную?

Я знаю, что есть объект с именем Sorting, но он, похоже, не работает, поскольку ArrayBuffer не реализует / не расширяет нужные классы.

Как мне отсортировать ArrayBuffer[A] тип массивов?

Ответы [ 2 ]

8 голосов
/ 23 декабря 2009

Если вы используете Scala 2.8, вы можете использовать метод sortWith класса ArrayBuffer[T], который унаследован от черты SeqLike.

Следующий фрагмент кода сортирует объект ArrayBuffer[T] в порядке возрастания:

def ascendingSort[T <% Ordered[T]](xs: ArrayBuffer[T]) = xs.sortWith(_ < _)

Обратите внимание, что это не изменяет фактический ArrayBuffer, но создает новый с элементами в правильном порядке.

Если вы используете Scala 2.7, вы можете использовать метод stableSort объекта Sorting. Это берет элементы ArrayBuffer и производит массив элементов, отсортированных в правильном порядке (заданный замыканием в качестве аргумента, восходящий по умолчанию).

Например:

val a = new scala.collection.mutable.ArrayBuffer[Int]()
a += 5
a += 2
a += 3

scala.util.Sorting.stableSort(a)

Важным вопросом является то, что вы хотите сделать с ArrayBuffer. Обычно Buffer используется внутри различных алгоритмов для повышения производительности промежуточных результатов. Если вы используете его для этого, взгляните на способы сортировки коллекции, которую вы хотите вернуть, в конце вашего алгоритма. Объект Sorting уже предоставляет способ преобразования ArrayBuffer в отсортированный Array.

Из скаладока класса Buffer:

Буферы используются для последовательного создания последовательностей элементов

Поскольку вы используете его с Actor s, его можно использовать для какой-то очереди актеров - в этом случае вы можете захотеть взглянуть на коллекцию Queue.

Надеюсь, это поможет,

- Flaviu Cipcigan

0 голосов
/ 25 декабря 2009

Кстати, класс Actor - это мой собственный класс, используемый для «Актеров» в мире, созданном с использованием моего нового игрового движка для scala («Удивительный игровой движок для Scala ~ AGES»), поэтому он не имеет ничего общего с параллелизмом. актерский класс. Кроме того, реализации списков в scala - это джунгли, все или устарело, или реализовано множеством разных способов ... ArrayBuffer работает для меня (мне нужно быть массивом переменного размера для размещения актеров).

Надеюсь, это прояснит:)

...