Стабильны ли комбинации и перестановки в коллекциях Scala?

#scala #scala-collections

#scala #scala-collections

Вопрос:

Должен ли я полагаться на порядок комбинаций и перестановок, сгенерированных соответствующими методами коллекций Scala? Например:

 scala> Seq(1, 2, 3).combinations(2).foreach(println)
List(1, 2)
List(1, 3)
List(2, 3)
  

Могу ли я быть уверен, что получу свои результаты всегда в одном и том же точном порядке?

Ответ №1:

Ну, в документации ничего не говорится о порядке. В нем просто говорится:

Итератор, который перебирает возможные n-элементные комбинации этой последовательности.

Таким образом, это не гарантирует. В идеале вы всегда должны получать порядок по мере печати, но библиотека этого не гарантирует. Так что (пессимистично) безопасно не доверять этому и скорее отсортировать его так, чтобы вы всегда получали одну и ту же серию:

 scala> import scala.math.Ordering.Implicits._
import scala.math.Ordering.Implicits._

scala> Seq(1,2,3).combinations(2).toList.sorted.foreach(println)
List(1, 2)
List(1, 3)
List(2, 3)
  

Комментарии:

1. Спасибо за плохие новости 🙂 Сортировка их может быть проблематичной, потому что обе имеют тенденцию быть очень большими в коллекциях разумного размера.

Ответ №2:

combinations Реализация поддерживает порядок элементов в заданной последовательности.

За исключением того, что входные данные обрабатываются для группировки повторяющихся элементов вместе.

Выходные данные не отсортированы.

  scala> Seq(3,2,1).combinations(2).toList
 res1: List[Seq[Int]] = List(List(3, 2), List(3, 1), List(2, 1))
  

Последовательность обновляется, чтобы сохранить повторяющиеся элементы вместе. Например:

  scala> Seq(2,1,3,1,2).combinations(2).toList
 res2: List[Seq[Int]] = List(List(2, 2), List(2, 1), List(2, 3), List(1, 1), List(1, 3))
  

в этом случае seq сначала преобразуется в Seq(2,2,1,1,3):

  scala> Seq(2,2,1,1,3).combinations(2).toList
 res3: List[Seq[Int]] = List(List(2, 2), List(2, 1), List(2, 3), List(1, 1), List(1, 3))

 scala> res2 == res3
 res4: Boolean = true
  

Комментарии:

1. Хорошо, что вы упомянули эту особенность, касающуюся повторяющихся элементов, поскольку я этого не знал.