existe-t-il un moyen dans Scala pour trier un tableau de tuples en utilisant et une fonction de comparaison arbitraire? En particulier, j'ai besoin de trier et de tableau de tuples par leur deuxième élément, mais je voulais connaître une technique générale pour trier des tableaux de tuples.
Merci!
Vous pouvez utiliser ce code:
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))
Malheureusement, il semble que Scala ne peut pas déduire le type du tableau passé à stableSort
. J'espère que cela vous convient.
Dans scala 2.8, il existe une méthode sortBy. Voici un cas d'utilisation simple:
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>
S'il s'agit d'un Array
, il est probablement typique d'utiliser des algorithmes de tri sur place. Cependant, en idiomatique Scala, les collections modifiables ne sont généralement pas encouragées/utilisées. Si tel est le cas et que vous avez une collection immuable (ou souhaitez ne pas modifier le Array
dans place), utilisez 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)
trier un Array
ou toute autre collection de tuples:
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))
Sur Scala 2.8 (oui, encore une fois :), vous pouvez également le faire:
val v = Array(('a', 2), ('b', 1))
scala.util.Sorting.stableSort(v)(manifest[(Char, Int)], Ordering.by(_._2))
Dans le cas spécifique des paires, cela peut également fonctionner pour trier premier par le deuxième élément, puis par le premier:
scala.util.Sorting.stableSort(v)(manifest[(Char, Int)], Ordering.by(_.swap))
2.7 et pas en place:
(Array((2,3), (4,2), (1,5)).toList.sort (_._2 < _._2)).toArray
Vous voulez probablement def stableSort[K](a : Seq[K], f : (K, K) => Boolean) : Array[K]
de scala.util.Sorting.
Votre fonction de comparaison serait quelque chose comme _._2 < _._1
val l = List((2, 1), (3, 2), (0, 3))
l sort { case(a, b) => a > b }