Я борюсь в scala, потому что хочу отсортировать Seq простого класса case, который выглядит следующим образом:

case class A(seqOfB: Seq[B],
             order_index: Int)

case class B(name: String,
             order_index: Int)

Как видите, он содержит еще один класс case. Что я хочу сделать, так это заказать Seq, который содержит 2 экземпляра A, по order_index из A. Первый элемент в Seq имеет order_index 2 и имеет 1 B в его Seq. Второй элемент в Seq имеет order_index 1 и 2 B в его Seq:

val seqOfA = Seq(
        A(
           seqOfB = Seq(
            B(
              name ="cde",
              order_index = 21
            )
          ),
          order_index = 2
        ),
        A(
          seqOfB = Seq(
            B(
              name = "abc",
              order_index = 11
            ),
            B(
              name = "bcd",
              order_index = 12
            )
          ),
          order_index = 1
        )
      )

Мой код для сортировки выглядит так:

seqOfA.sortBy(_.order_index)
println(seqOfA)

Вопреки моим ожиданиям, функция sortBy () ничего не делает, а Seq никоим образом не меняется. Разве в Scala невозможно отсортировать конструкцию, подобную моей, или есть другой способ добиться того, чего я хочу?

Я также пробовал сортировать с помощью функции sortWith (), но она тоже ничего не делает.

-1
Siegfried XVI 14 Окт 2020 в 16:28

1 ответ

Лучший ответ

Это неизменяемые структуры данных. Вы не сортируете их на месте - вы возвращаете обновленные значения из методов.

seqOfA.sortBy(_.order_index)
println(seqOfA)

Такой же как

val oldValue = seqOfA
val newValue = oldValue.sortBy(_.order_index)
println(oldValue)

Если вы хотите получить желаемые результаты, просто присвойте результат sortBy переменной и распечатайте эту переменную.

5
Mateusz Kubuszok 14 Окт 2020 в 13:40