Перевод кода с Ruby на Scala - сортировка в Scala - PullRequest
0 голосов
/ 13 мая 2018

Я конвертирую некоторый код из Ruby в Scala. Проблема в том, что я никогда не программировал Ruby в своей жизни. Все идет хорошо, но теперь я достиг линии, которую я не знаю, потому что я новичок в Scala и я не понимаю механизм сортировки. Поэтому я хочу перевести эту рубиновую строку в scala:

fronts[last_front].sort! {|x,y| crowded_comparison_operator(x,y)}

fronts - это Vector[Vector[Map[String, Any]]]

last_front является Int

crowded_comparison_operator(x,y) возвращает -1, 0 или 1, x и y равны Map[String, Any]

1 Ответ

0 голосов
/ 13 мая 2018

У вас есть две возможности со стандартными коллекциями 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! сортирует массив на месте. Это не может работать для неизменного вектора, поэтому вы должны соответствующим образом скорректировать код.

...