#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. Хорошо, что вы упомянули эту особенность, касающуюся повторяющихся элементов, поскольку я этого не знал.