2010-04-13 16 views

Respuesta

21

Usted puede utilizar este código:

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)) 

Unfortunetly, parece que la Scala no puede deducir el tipo de la matriz pasada a stableSort. Espero que esté bien para ti.

+0

Eso es lo que estaba buscando! ¡Muchas gracias! –

+0

Bit nice: 'stableSort (v, (_._ 2 <_._ 2): ((Char, Int), (Char, Int)) => Boolean)' - mantiene las preocupaciones por separado, y permite razonar sobre el la lógica y los tipos como pasos independientes, especialmente porque la firma de tipo en línea es solo una molestia aquí. –

1

Probablemente desee def stableSort[K](a : Seq[K], f : (K, K) => Boolean) : Array[K] de scala.util.Sorting.
Su función de comparación sería algo así como _._2 < _._1

115

En scala 2.8, hay un método sortBy. Aquí es un simple caso de uso:

Welcome to Scala version 2.8.0.r21376-b20100408020204 (Java HotSpot(TM) Client VM, Java 1.6.0_18). 
Type in expressions to have them evaluated. 
Type :help for more information. 

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> 
+2

Aprendí sobre el género Por tu respuesta, ¡gracias! – Jawher

+7

2.8 es simplemente hacer trampa. +1 – tstenner

+0

Gooood. Tendré que cambiar a 2.8 (actualmente usando 2.7) Gracias –

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

El problema es que tengo una matriz :( –

3

En Scala 2.8 (sí, otra vez :), también se puede hacer esto:

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

En el caso específico de pares, esto también puede trabajar para ordenar primera por el segundo elemento, y luego por la primera:

scala.util.Sorting.stableSort(v)(manifest[(Char, Int)], Ordering.by(_.swap)) 
2

2,7 y no en lugar:

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

Si se trata de un Array, probablemente es típico usar en el lugar algoritmos de ordenación. Sin embargo, en el código de Scala idiomático, las colecciones mutables generalmente no se fomentan/utilizan. Si ese es el caso y usted tiene la colección inmutables de la mañana (o quisiera no modificar el Array en su lugar), utilice 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) 

clasificar un Array o cualquier otra colección de tuplas:

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)) 
+0

¿dónde podemos encontrar acerca de esa sintaxis "_._ 2"? ¿Cómo se llama eso? –

+1

Quizás esto ayude: http://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-an-underscore-in-scala –

Cuestiones relacionadas