У вас есть две возможности со стандартными коллекциями Scala:
- Преобразуйте вывод
-1, 0, 1
для crowded_comparison_operator
в логическое значение, которое сообщает вам, меньше ли первый элемент, чем второй элемент, затем используйте sortWith
.
- определите новый
Ordering
, передайте его явно методу sorted
.
Метод sortWith
Первый элемент меньше второго, если и только если crowded_comparison_operator
возвращает -1, так что вы можете сделать это:
fronts(last_front).sortWith{ (x, y) => crowded_comparison_operator(x, y) < 0 }
Определение Ordering
для sorted
Метод sorted
принимает неявный параметр Ordering
. Вы можете определить свой собственный заказ и передать его явно:
import scala.math.Ordering
fronts(last_front).sorted(new Ordering[Vector[Map[String, Any]]] {
def compare(
x: Vector[Map[String, Any]],
y: Vector[Map[String, Any]]
): Int = crowded_comparison_operator(x, y)
})
или короче, с версиями Scala, поддерживающими SAM (начиная с 2.11.5, если я правильно помню):
fronts(last_front).sorted(
(x: Vector[Map[String, Any], y: Vector[Map[String, Any]]) =>
crowded_comparison_operator(x, y)
)
Обратите внимание, что, как указал @mikej, Ruby's sort!
сортирует массив на месте. Это не может работать для неизменного вектора, поэтому вы должны соответствующим образом скорректировать код.