web-dev-qa-db-fra.com

Scala: comment trier un tableau de tuples par leur deuxième élément?

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!

50
pau.estalella

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.

23
Michel Krämer

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>
122
Eastsun

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))
9
Erik Allik

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))
3
Daniel C. Sobral

2.7 et pas en place:

(Array((2,3), (4,2), (1,5)).toList.sort (_._2 < _._2)).toArray
2
user unknown

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

1
tstenner
val l = List((2, 1), (3, 2), (0, 3))
l sort { case(a, b) => a > b }
1
Jawher