Сортировка последовательности классов case, которая содержит другую последовательность классов case

#scala

#scala

Вопрос:

Я испытываю трудности в scala, потому что я хочу отсортировать последовательность простого класса 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. Первый элемент в последовательности имеет order_index 2 и имеет 1 B в своей последовательности. Второй элемент в 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() ничего не делает, и последовательность никак не меняется. Невозможно ли в Scala отсортировать конструкцию, подобную моей, или есть другой способ добиться того, чего я хочу?

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

Ответ №1:

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

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

Совпадает с

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

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