(1 oktober 2017 F5 1 ) Dagens text Programmeringsteknik Mer om Scanner-klassen Dialogrutor (klassen JOptionPane) Bubbelsortering ArrayList Omslagsklasser
Arbetsexempel (1 oktober 2017 F5 2 )
Pokertärningar (1 oktober 2017 F5 3 )
(1 oktober 2017 F5 4 ) Gamla tärningsklassen med nytt namn 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
(1 oktober 2017 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!
(1 oktober 2017 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!
(1 oktober 2017 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.
(1 oktober 2017 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
(1 oktober 2017 F5 9 ) En snyggare lösning som dock är mycket överkurs Behåll den ursprungliga definitionen av klassen Dice och skriv PokerDice som en specialisering av Dice: public class PokerDice extends Dice { private static final String[] symbols = {"9 ", "10", "Kn", "D ", "K ", "E "; public String tostring() { return symbols[value-1]; Metoden roll (liksom andra metoder) ärvs från klassen Dice och den parameterlösa konstruktorn kommer att användas.
(1 oktober 2017 F5 10 ) PokerSet - 5 pokertärningar Hur kommer man igång?
(1 oktober 2017 F5 11 ) PokerSet - 5 pokertärningar 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) {...
(1 oktober 2017 F5 12 ) PokerSet: Konstruktor public class PokerSet { private PokerDice[] thedice; public PokerSet() { thedice = new PokerDice[5];? Man måste även skapa elementen i arrayen!
(1 oktober 2017 F5 13 ) 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.
(1 oktober 2017 F5 14 ) 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();
(1 oktober 2017 F5 15 ) 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
(1 oktober 2017 F5 16 ) PokerSet: tostring-metoden public String tostring() { String result = thedice[0].tostring(); for (int i=1; i < thedice.length; i++) { result += ", " + thedice[i].tostring(); return "[" + result + "]"; Fråga: Kan man använda for - each? Svar: Nja, svårt med kommatecknet. Fråga: Behöver man de explicita anropen till tärningens tostring? Svar: Ja, det första men inte det inuti loopen.
(1 oktober 2017 F5 17 ) PokerSet: tostring-metoden Anna berättade om klassen Arrays på förra föreläsningen. Där finns en användbar klassmetod: public String tostring() { return Arrays.toString(theDice); Fråga: Hur vet Arrays.toString hur en tärning ska göras till en sträng? Svar: Använder tostring i Dice! Klassen Arrays bör (måste?) importeras. Hur och varför?
(1 oktober 2017 F5 18 ) 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
(1 oktober 2017 F5 19 ) 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
(1 oktober 2017 F5 20 ) 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 >
(1 oktober 2017 F5 21 ) 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.
(1 oktober 2017 F5 22 ) 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
(1 oktober 2017 F5 23 ) 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
(1 oktober 2017 F5 24 ) 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: (Sorterar i fallande ordning) if (a[i] < a[i+1]) { int temp = a[i]; a[i] = a[i+1]; a[i+1] = temp;
(1 oktober 2017 F5 25 ) 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.
(1 oktober 2017 F5 26 ) 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 successivt kan kortas) men...
(1 oktober 2017 F5 27 ) 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;
(1 oktober 2017 F5 28 ) PokerSet - Sortering Vem ska anropa sort? main? roll? tostring? Konstruktorn?
(1 oktober 2017 F5 29 ) 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!
(1 oktober 2017 F5 30 ) 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.
(1 oktober 2017 F5 31 ) 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();...
(1 oktober 2017 F5 32 ) 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!
(1 oktober 2017 F5 33 ) Dialogrutor Klassen javax.swing.joptionpane har ett antal static-metoder för att kommunicera via dialogrutor. JOptionPane.showMessageDialog(null,"Ciao!");
(1 oktober 2017 F5 34 ) Dialogrutor JOptionPane.showInputDialog(null, "Hur många?"); Metoden returnerar en sträng som man, t ex, kan koppla ett Scanner-objekt till.
(1 oktober 2017 F5 35 ) 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.
(1 oktober 2017 F5 36 ) 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
(1 oktober 2017 F5 37 ) 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
(1 oktober 2017 F5 38 ) 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
(1 oktober 2017 F5 39 ) 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]
(1 oktober 2017 F5 40 ) 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[]>();
(1 oktober 2017 F5 41 ) Omslagsklasser Hur gör man för att lagra t ex int eller double? Man använder 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]
(1 oktober 2017 F5 42 ) 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
(1 oktober 2017 F5 43 ) 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
(1 oktober 2017 F5 44 ) Att fundera på Vad tas bort av satsen numbers.remove(3); Är det element på plats 3 eller elementet som innehåller 3? Hur gör man för att få den variant som det inte är?