2010-04-13 3 views

Antwort

21

können Sie diesen Code verwenden:

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, es scheint, dass Scala den Typ des Arrays nicht ableiten kann zu stableSort weitergegeben. Ich hoffe, das ist in Ordnung für dich.

+0

Das ist wonach ich gesucht habe! Danke vielmals! –

+0

Bit nicer: 'stableSort (v, (_._ 2 <_._ 2): ((Zeichen, Int), (Zeichen, Int)) => Boolean)' - hält die Sorgen getrennt, und erlaubt es, über die Logik und die Typen als eigenständige Schritte, zumal die Inline-Typ-Signatur hier nur lästig ist. –

1

Wahrscheinlich möchten Sie def stableSort[K](a : Seq[K], f : (K, K) => Boolean) : Array[K] von scala.util.Sorting.
Ihre Vergleichsfunktion wäre etwas wie _._2 < _._1

115

In scala 2.8 gibt es eine Methode sortBy. Hier ist ein einfacher Anwendungsfall:

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

Über die sortBy von dir gelernt Antwort, danke! – Jawher

+7

2.8 ist einfach nur betrügen. +1 – tstenner

+0

Gooood. Ich muss auf 2.8 umstellen (derzeit 2.7) Danke –

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

Problem ist, ich habe ein Array :( –

3

Auf Scala 2.8 (ja, wieder :), können Sie auch dies tun können:

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

Im speziellen Fall von Paaren kann dies auch arbeiten erste durch das zweite Element zu sortieren, und dann durch die ersten:

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

2,7 und nicht an Ort und Stelle:

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

Wenn es ein Array ist, ist es wahrscheinlich typisch an Ort und Stelle verwenden Sortieralgorithmen. Im idiomatischen Scala-Code werden jedoch veränderbare Sammlungen normalerweise nicht unterstützt. Wenn das der Fall ist, und Sie haben am unveränderlichen Sammlung (oder mögen nicht die Array anstelle ändern), verwendet 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) 

ein Array oder jede andere Sammlung von Tupeln Sortierung:

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

wo können wir über die "_._ 2" -Syntax finden? Wie heißt das? –

+1

Vielleicht wird dies helfen: http://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-andunderscore-in-scala –

Verwandte Themen