I denne debattråd udtrykker skribenten alene deres egen holdning om emnet. Hold venligst vores debatregler i tankerne hvis du ønsker at deltage i debatten.

Sortering af liste med java objekter

1
23. august 2009 kl. 11:29

Man kan bruge Java objekter i Scala programmer, her er et lille eksempel som demonstrerer forskelle imellem Scala's egne objekter og Java objekter.

Jeg har brugt Scala's interaktive shell (http://www.scala-lang.org/node/2097) til dette. Hvis man installerer Scala 2.8 så får man yderligere hjælp i form af tab-completion.

[code=ocaml]
Welcome to Scala version 2.8.0.r18245-b20090709234242 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_14).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val x = List(3,2,1)
x: List[Int] = List(3, 2, 1)
[/code]

settingsDebatindstillinger
2
23. august 2009 kl. 11:53

(hæ, da man ikke kan redigere indlægene så må man "besvare" dem)

Nå, men det var en Scala liste som blev kreeret. Hvert element har typen "Int" som kompileren enten oversætter til Java's primitive "int" eller klassen "Integer" alt efter om der er behov for de metoder som der på klassen.

[code=text] scala> x.sort(<) warning: there were deprecation warnings; re-run with -deprecation for details res0: List[Int] = List(1, 2, 3) [/code] Her bliver der kaldt sort funktionen på List objektet, den tager en compare funktion som parameter. "<" er syntaksen for den inbyggede "mindre end" når den skal være en parameter. Denne kendte infix funktion bruges fx sådan: [code=text] scala> if (2 < 3) "ja" else "nej" res8: java.lang.String = ja [/code]

Lad os lave en liste med Java objekter: [code=text] scala> val jx = Listjava.lang.Integerjx: List[java.lang.Integer] = List(3, 2, 1) [/code] Vi prøver at sortere: [code=text] scala> jx.sort(<)
:6: error: could not find implicit value for parameter ord:Ordering[java.lang.Integer]. jx.sort(<) [/code] Det kan man ikke, fordi "<" ikke er defineret for java.lang.Integer. Så kan man i stedet lave en anonym funktion som udnytter Comparable klassens compareTo metode, da Integer nedarver fra Comparable. [code=text] scala> jx.sort((x,y) => x.compareTo(y) < 0) warning: there were deprecation warnings; re-run with -deprecation for details res4: List[java.lang.Integer] = List(1, 2, 3) [/code]

2
23. august 2009 kl. 12:34

Signaturen på sort funktionen er: [code=text] ((java.lang.Integer, java.lang.Integer) => Boolean) => List[java.lang.Integer] [/code] Den tager en funktion med en 2-tuple parameter som resulterer i en Boolean, der angiver om det første element er mindre end det andet element. Resultatet af sorteringen bliver en List med java.lang.Integer elementer.

Hvad så hvis der er null værdier? Jeg laver en ny liste hvor der "conses"(::) et null element på den foregående liste, "::" er en infix funktion som tilføjer et element.
[code=text] scala> val jx1 = null::jx jx1: List[java.lang.Integer] = List(null, 3, 2, 1)

scala> jx1.sort((x,y) => x.compareTo(y) < 0) warning: there were deprecation warnings; re-run with -deprecation for details java.lang.NullPointerException at $anonfun$1.apply(:8) ... [/code] Men, man kan ikke kalde compareTo på en null værdi, så man må checke for null. [code=text] scala> jx1.sort((x,y) => if (x == null) true else x.compareTo(y) < 0) warning: there were deprecation warnings; re-run with -deprecation for details res6: List[java.lang.Integer] = List(null, 1, 2, 3) [/code] I dette tilfælde bliver null sammenlignet til at være minimum. Hvis man vil sortere med faldende værdier: [code=text] scala> jx1.sort((x,y) => if (x == null) false else x.compareTo(y) > 0) warning: there were deprecation warnings; re-run with -deprecation for details res13: List[java.lang.Integer] = List(3, 2, 1, null) [/code]

2
23. august 2009 kl. 12:35

Fx sort funktionen: [code=text] scala> jx.sort _ warning: there were deprecation warnings; re-run with -deprecation for details res15: ((java.lang.Integer, java.lang.Integer) => Boolean) => List[java.lang.Integer] = [/code]