2010-04-13 7 views

risposta

21

È possibile utilizzare questo codice:

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, sembra che alla Scala non può dedurre il tipo di matrice passata a stableSort. Spero che sia ok per te.

+0

Ecco quello che stavo cercando! Molte grazie! –

+0

Bit più bello: 'stableSort (v, (_._ 2 <_._ 2): ((Char, Int), (Char, Int)) => Boolean)' - mantiene le preoccupazioni separate e consente di ragionare la logica e i tipi come passi indipendenti, specialmente dal momento che la firma del tipo inline è solo una seccatura qui. –

1

Probabilmente si desidera def stableSort[K](a : Seq[K], f : (K, K) => Boolean) : Array[K] da scala.util.Sorting.
La tua funzione di confronto sarebbe qualcosa come _._2 < _._1

115

In scala 2.8, c'è un metodo sortBy. Ecco un semplice caso d'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

Imparato circa l'ordinamento Dalla tua risposta, grazie! – Jawher

+7

2.8 è semplicemente un inganno. +1 – tstenner

+0

Gooood. Dovrò passare a 2.8 (attualmente usando 2.7) Grazie –

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

Problema è che ho una matrice :( –

3

Su Scala 2.8 (sì, ancora una volta :), si può anche fare questo:

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

Nel caso specifico di coppie, anche questo può lavorare per ordinare prima dal secondo elemento, e quindi dal primo:

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

2,7 e non in luogo:

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

Se è un Array, probabilmente è tipico da utilizzare sul posto algoritmi di ordinamento. Tuttavia, nel codice Scala idiomatico, le raccolte mutabili di solito non sono incoraggiate/utilizzate. Se questo è il caso e si dispone del mattino raccolta immutabili (o vorrebbe non modificare il Array sul posto), utilizzare 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) 

ordinamento di un Array o qualsiasi altra raccolta di tuple:

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

dove possiamo trovare circa su tale sintassi "_._ 2"? Che cosa è che si chiama? –

+1

Forse questo aiuterà: http://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-an-underscore-in-scala –

Problemi correlati