(16 februari 2016 F5.1 ) Dagens text Programmeringsteknik Mer om Scanner-klassen Dialogrutor (klassen JOptionPane) Bubbelsortering ArrayList Omslagsklasser
Arbetsexempel (16 februari 2016 F5.2 )
Pokertärningar (16 februari 2016 F5.3 )
(16 februari 2016 F5.4 ) Tärning public class PokerDice { private int value; public PokerDice() { this.roll(); public int getvalue() { return this.value; public void roll() { this.value = (int)(math.random()*6) + 1; public String tostring() { return "" + value; Observera public static void main(string[] args) { PokerDice d = new PokerDice(); for (int i= 1; i<=50; i++) { d.roll(); System.out.print(d + " "); if (i%10 == 0) { System.out.println(); > run PokerDice 2 5 4 1 1 2 6 3 1 2 1 2 6 1 4 1 2 5 1 3 6 3 4 2 5 3 6 5 4 6 5 1 4 2 1 5 1 5 4 3 6 5 3 3 1 3 1 4 4 6
(16 februari 2016 F5.5 ) Hur gör vi en tärning till en pokertärning? Om vi kör precis samma main som ovan vill vi ha > run PokerDice E Kn 9 K 9 10 9 10 K K E E 10 9 Kn E 9 9 Kn Kn 10 10 10 Kn K 9 K Kn K Kn E E Kn D 9 K D Kn 9 D 9 E D K Kn D D E E D Lösning: Skriv om tostring-metoden!
(16 februari 2016 F5.6 ) tostring Försök 1 public String tostring() { if (value == 1 ) return "9"; else if (value == 2) return "10";...? Nää! Glöm det!
(16 februari 2016 F5.7 ) Bättre tostring Gör en array med strängar: String[] symbols = {"9 ", "10", "Kn", "D ", "K ", "E "; och använd value-1 som index: return symbols[value-1]; i tostring-metoden.
(16 februari 2016 F5.8 ) Var ska symbols deklareras? Som lokal variabel i tostring-metoden: public String tostring() { String[] symbols = {"9 ", "10", "Kn", "D ", "K ", "E "; return symbols[value-1]; eller som en instansvariabel i klassen PokerDice: public class PokerDice { private int value; private String[] symbols = {"9 ", "10", "Kn", "D ", "K ", "E "; Bäst är att göra den till en klassvariabel (eller konstant): public class PokerDice { private int value; private static String[] symbols = {"9 ", "10", "Kn", "D ", "K ", "E "; DrJava
(16 februari 2016 F5.9 ) PokerSet - 5 pokertärningar Hur kommer man igång? Princip: Se till att ha något som kan köras så fort som möjligt! public class PokerSet { instansvariabler private PokerDice[] thedice; konstruktor public PokerSet() {... tostring-metod public String tostring() {... main-metod public static void main(string[] a) {...
(16 februari 2016 F5.10 ) PokerSet: Konstruktor public class PokerSet { private PokerDice[] thedice; public PokerSet() { thedice = new PokerDice[5];? Man måste även skapa elementen i arrayen!
(16 februari 2016 F5.11 ) PokerSet: Konstruktor public class PokerSet { private PokerDice[] thedice; public PokerSet() { thedice = new PokerDice[5]; for (int i=0; i<5; i++) { thedice[i] = new PokerDice(); En sak som jag inte gillar - den magiska talet 5.
(16 februari 2016 F5.12 ) PokerSet: Konstruktor Snyggare: public class PokerSet { public static final int NUMBER_OF_DICE = 5; private PokerDice[] thedice; public PokerSet() { thedice = new PokerDice[NUMBER_OF_DICE]; for (int i=0; i<thedice.length; i++) { thedice[i] = new PokerDice();
(16 februari 2016 F5.13 ) PokerSet: Ännu snyggare med två konstruktor public class PokerSet { private PokerDice[] thedice; public PokerSet(int numberofdice) { thedice = new PokerDice[numberOfDice]; for (int i=0; i<thedice.length; i++) { thedice[i] = new PokerDice(); public PokerSet() { this(5); Observera att vi inte behöver (och därmed inte bör) lagra antalet tärningar. Koden kan använda thedice.length
(16 februari 2016 F5.14 ) PokerSet: tostring-metoden public String tostring() { String result = "" + thedice[0]; for (int i=1; i<thedice.length; i++) { result += ", " + thedice[i]; return "[" + result + "]"; Kan man använda for - each? Nej, svårt med kommatecknet. Anna berättade om Arrays på förra föreläsningen. Där finns en bra klassmetod: public String tostring() { return Arrays.toString(theDice);
(16 februari 2016 F5.15 ) PokerDice: Första körbara program import java.util.arrays; public class PokerSet { private PokerDice[] thedice; public PokerSet() { this(5); public static void main(string[] args) PokerSet pokerset = new PokerSet(); System.out.println(pokerSet); public String tostring() { return Arrays.toString(theDice); public PokerSet(int numberofdice) { thedice = new PokerDice[numberOfDice]; for (int i=0; i<thedice.length; i++) { thedice[i] = new PokerDice(); DrJava
(16 februari 2016 F5.16 ) PokerDice: Metoden roll med test i main public void roll() { for (PokerDice dice : thedice) { dice.roll(); public static void main(string[] args) { PokerSet pokerset = new PokerSet(); while (true) { pokerdice.roll(); System.out.println(pokerSet); DrJava
(16 februari 2016 F5.17 ) PokerDice: Resultat med fråga om fortsätta Så här: [9, D, Kn, 9, K ] Igen? (j/n) j [E, D, Kn, D, K ] Igen? (j/n) j [9, E, 10, 9, E ] Igen? (j/n) n >
(16 februari 2016 F5.18 ) Klassen Scanner Klassen Scanner är mycket användbar för att läsa och tolka text (strömmar av tecken). Klassen importeras: import java.util.scanner Måste kopplas till den teckenström den ska tolka. Det görs när man skapar scanner-objektet dvs i konstruktoranropet: Scanner scan = new Scanner(System.in) som kopplar scannern till tangentbordet.
(16 februari 2016 F5.19 ) Klassen Scanner Den enda Scanner-metod som behöver just nu är String nextline() som hämtar och returnerar nästa rad. Så här:... System.out.print("Igen? (j/n)"); String answer = scan.nextline();... DrJava
(16 februari 2016 F5.20 ) PokerSet: main-metod med do-sats public static void main(string[] args) { PokerSet pokerset = new PokerSet(); Scanner scan = new Scanner(System.in); String answer; do { pokerset.roll(); System.out.println(pokerSet); System.out.print("Igen? (j/n)"); answer = scan.nextline(); while (!answer.equals("n")); DrJava
(16 februari 2016 F5.21 ) Utfallet bör presenteras sorterat! Vi tittar på bubbelsortering som kanske är den enklaste att koda men också en av de sämsta. Inget problem vid små mängder. Antag att vi har en int[] a med n element som ska sorteras. Den fundamentala operationen i bubbelsort är att jämföra två intilliggande element och byta plats ( swappa ) om ordningen är fel: if (a[i] < a[i+1]) { int temp = a[i]; a[i] = a[i+1]; a[i+1] = temp;
(16 februari 2016 F5.22 ) Sortering med Bubbelsort Denna operation ska upprepas för alla möjliga värden på i (dvs från 0 till n-2): for (int i=0; i<n-1; i++) { if (a[i] < a[i+1]) { int temp = a[i]; a[i] = a[i+1]; a[i+1] = temp; Detta svep över arrayen måste sedan upprepas tills den är sorterad.. Antingen tänker man efter hur många gånger det maximalt kan behövas eller så kollar man om det blev någon swap.
(16 februari 2016 F5.23 ) Sortering med Bubbelsort Vi använder en logisk variabel swapped för att avgöra om det blivit något byte under ett svep. boolean swapped = true; while (swapped) { swapped = false; for (int i=0; i<n-1; i++) { if (a[i] < a[i+1]) { int temp = a[i]; a[i] = a[i+1]; a[i+1] = temp; swapped = true; Det går att effektivisera algoritmen en del (t ex genom att inse att den inre loppen succesivt kan kortas) men...
(16 februari 2016 F5.24 ) PokerSet - Sortering Använd getvalue för att avgöra ordning! public void sort() { boolean swapped = true; while (swapped) { swapped = false; for (int i = 0; i < thedice.length - 1; i++) { if (thedice[i].getvalue() < thedice[i+1].getvalue() ) { PokerDice temp = thedice[i]; thedice[i] = thedice[i+1]; thedice[i+1] = temp; swapped = true;
(16 februari 2016 F5.25 ) PokerSet - Sortering Vem ska anropa sort? main? roll? tostring? Konstruktorn?
(16 februari 2016 F5.26 ) PokerDice: Fråga användaren vilka som ska slås om Vad behövs? En metod för att slå om enskilda tärningar. Räcker med en metod som kan slå om en specificerad tärning. public void roll(int i) { thedice[i-1].roll(); Fråga användaren (System.out.print) och läsa in ett antal tal. Scanner-uppgift!
(16 februari 2016 F5.27 ) Mer om klassen Scanner Två Scanner-metoder: int nextint() läser och returnerar ett heltal. Fel om de tecken som står på tur inte kan tolkas som ett heltal. boolean hasnextint() returnerar true om det som står på tur kan tolkas som ett heltal, annars false.
(16 februari 2016 F5.28 ) PokerDice: Fråga användaren vilka som ska slås om Vi kan läsa tal från den redan skapade scannern (scan) men svårt att veta hur många tal som ska läsas. Betydligt bättre: Läs in en hel rad med scan.nextline() Skapa ett nytt Scanner-objekt (säg linescanner) som kopplas till den inlästa raden (dvs till ett String-objekt). Tolka talen från raden med while-loopen: while (linescanner.hasnextint()) { int d = linescanner.nextint();...
(16 februari 2016 F5.29 ) PokerDice do {... System.out.print("Vilka ska slås om? "); answer = scan.nextline(); Scanner linescanner = new Scanner(answer); while (linescanner.hasnextint()) { pokerset.roll(linescanner.nextint()); pokerset.sort(); System.out.println(pokerSet);... while (!answer.equals("n")); Saknas: Felhantering!
(16 februari 2016 F5.30 ) Dialogrutor Klassen javax.swing.joptionpane har ett antal static-metoder för att kommunicera via dialogrutor. JOptionPane.showMessageDialog(null,"Ciao!");
(16 februari 2016 F5.31 ) Dialogrutor JOptionPane.showInputDialog(null, "Hur många?"); Metoden returnerar en sträng som man, t ex, kan koppla ett Scanner-objekt till.
(16 februari 2016 F5.32 ) Användning i PokerDice while (true) { pokerset.roll(); pokerset.sort(); String ans = JOptionPane.showInputDialog(null, pokerset + "\nvilka vill du slå om?"); if (ans==null) { break; Scanner scan = new Scanner(ans); while (scan.hasnextint()) { pokerset.roll(scan.nextint()); pokerset.sort(); JOptionPane.showMessageDialog(null, pokerset, "Resultat", JOptionPane.PLAIN_MESSAGE); Se eller hämta och testa den slutliga versionen av koden.
(16 februari 2016 F5.33 ) Arrayers styrkor och svagheter + Effektivt minnesutnyttjande + Snabb åtkomst till element med visst index + Snabb sökning om sorterat (med binär sökning eller hashteknik) Fix storlek Inlägg besvärligt om sorterat
(16 februari 2016 F5.34 ) Ett alternativ till arrayer: ArrayList En ArrayList är en arrayliknande struktur med följande egenskaper: Kan växa och krympa automatiskt Kan skjuta in nya element var som helst Kan ta bort element var som helst Kan använda index men en annan syntax än i arrayer Kan bara lagra objekt inte primitiva datatyper
(16 februari 2016 F5.35 ) Exempel ArrayList import java.util.arraylist; ArrayList<String> names; names = new ArrayList<String>(); Måste importeras Typen måste anges i deklarationen och i konstruktionen names.add("olle"); names.add("lisa"); names.add("lasse"); add lägger till sist System.out.println(names.get(1)); System.out.println(names); System.out.println("Size: " + names.size()); Lisa [Olle, Lisa, Lasse] Size: 3
(16 februari 2016 F5.36 ) Exempel ArrayList Der går att skjuta in, ändra och ta bort element. Exempel: names.add(1, "Anna"); System.out.println(names); names.set(2, "Britta"); System.out.println(names); names.remove(0); names.remove("lasse"); System.out.println(names); [Olle, Anna, Lisa, Lasse] [Olle, Anna, Britta, Lasse] [Anna, Britta]
(16 februari 2016 F5.37 ) Exempel ArrayList En ArrayList kan användas för att lagra godtyckliga objekt (av samma typ). Exempel: ArrayList<Turtle> turtles = new ArrayList<Turtle>(); ArrayList<Dice> dice = new ArrayList<Dice>(); ArrayList<int[]> intlists = new ArrayList<int[]>();
(16 februari 2016 F5.38 ) Omslagsklasser Hur gör man för att lagra t ex int eller double? Man använde omslagsklasserna Integer eller Double. Exempel: ArrayList<Integer> numbers = new ArrayList<Integer>(); for (int i = 0; i<=10; i++) { numbers.add(new Integer(i-5)); System.out.println(numbers); [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
(16 februari 2016 F5.39 ) Omslagsklasser: Hantering av objekten Integer io = numbers.get(7); System.out.println("Integer-objekt: " + io); int i = io.intvalue(); System.out.println("int-värde : " + i ); Integer-objekt: 2 int-värde : 2
(16 februari 2016 F5.40 ) Omslagsklasser: Automatiska konverteringar Autoboxing och autounboxing numbers.clear(); for (int i = 0; i<10; i++) { numbers.add(10-i); System.out.println(numbers); int s = 0; for (int i = 0; i<numbers.size(); i++) { s = s + numbers.get(i); System.out.println("Summan: " + s); [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] Summan: 55