Scala: как я могу отсортировать массив кортежей по их второму элементу? - PullRequest
50 голосов
/ 13 апреля 2010

есть ли в Scala способ сортировки массива кортежей с использованием функции произвольного сравнения? В частности, мне нужно отсортировать и массив кортежей по их второму элементу, но я хотел знать общую технику сортировки массивов кортежей.

Спасибо!

Ответы [ 7 ]

122 голосов
/ 13 апреля 2010

В scala 2.8 есть метод sortBy. Вот простой пример использования:

scala> val arr = Array(("One",1),("Two",2),("Four",4),("Three",3))
arr: Array[(java.lang.String, Int)] = Array((One,1), (Two,2), (Four,4), (Three,3))

scala> arr.sortBy(_._2)
res0: Array[(java.lang.String, Int)] = Array((One,1), (Two,2), (Three,3), (Four,4))

scala>
23 голосов
/ 13 апреля 2010

Вы можете использовать этот код:

scala> val v = Array(('a', 2), ('b', 1))
v: Array[(Char, Int)] = Array((a,2), (b,1))

scala> scala.util.Sorting.stableSort(v,
     | (e1: (Char, Int), e2: (Char, Int)) => e1._2 < e2._2)

scala> v
res11: Array[(Char, Int)] = Array((b,1), (a,2))

К сожалению, похоже, что Scala не может определить тип массива, переданного в stableSort. Я надеюсь, что это нормально для вас.

9 голосов
/ 27 октября 2013

Если это Array, вероятно, типично использовать алгоритмы сортировки на месте. Однако в идиоматическом коде Scala изменяемые коллекции обычно не поощряются / не используются. Если это так и у вас есть неизменяемая коллекция (или вы не хотите изменять Array на месте), используйте sortWith:

scala> val a = Array(1, 3, 2, 5)
a: Array[Int] = Array(1, 3, 2, 5)

scala> a.sortWith(_ > _)
res6: Array[Int] = Array(5, 3, 2, 1)

scala> a
res7: Array[Int] = Array(1, 3, 2, 5)

сортировка Array или любой другой коллекции кортежей:

scala> val a = Array(('a', 1), ('b', 4), ('c', 5), ('d', 2))
a: Array[(Char, Int)] = Array((a,1), (b,4), (c,5), (d,2))

scala> a.sortWith(_._2 > _._2)
res4: Array[(Char, Int)] = Array((c,5), (b,4), (d,2), (a,1))

scala> a
res5: Array[(Char, Int)] = Array((a,1), (b,4), (c,5), (d,2))
3 голосов
/ 13 апреля 2010

В Scala 2.8 (да, снова :), вы также можете сделать это:

val v = Array(('a', 2), ('b', 1))
scala.util.Sorting.stableSort(v)(manifest[(Char, Int)], Ordering.by(_._2))

В конкретном случае пар это также может работать для сортировки first повторой элемент, а затем первый:

scala.util.Sorting.stableSort(v)(manifest[(Char, Int)], Ordering.by(_.swap))
2 голосов
/ 14 апреля 2010

2,7 и не на месте:

(Array((2,3), (4,2), (1,5)).toList.sort (_._2 < _._2)).toArray
1 голос
/ 13 апреля 2010
val l = List((2, 1), (3, 2), (0, 3))
l sort { case(a, b) => a > b }
1 голос
/ 13 апреля 2010

Вы, вероятно, хотите def stableSort[K](a : Seq[K], f : (K, K) => Boolean) : Array[K] от scala.util.Sorting.
Ваша функция сравнения будет выглядеть примерно так: _._2 < _._1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...