Föreläsning 8. Föreläsning 8 Textfiler Flerdimensionella fält ArrayList enum switch-satsen

Relevanta dokument
Tvådimensionella fält

Föreläsning 7. Flerdimensionella fält ArrayList. Flerdimensionella. ArrayList. In- och utmatning av data

Föreläsning 8 Flerdimensionella fält ArrayList enum switch-satsen

Flerdimensionella fält och textfiler

Föreläsning 8. Föreläsning 8 Flerdimensionella fält ArrayList enum. Flerdimensionella. ArrayList enum switch-satsen. switch-satsen

Objektorienterad programmering

Föreläsning 8. Föreläsning 8

Föreläsning 8. Föreläsning 8 Flerdimensionella fält ArrayList enum. Flerdimensionella. ArrayList enum switch-satsen. switch-satsen

Repetition av OOP- och Javabegrepp

Repetition av OOP- och Javabegrepp

Föreläsning 8. Klassen String Mer om fält Klassen ArrayList

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Saker du ska kunna Föreläsning 13 & 14

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Föreläsning 7. for-satsen Fält

Föreläsning 3. Iteration while-satsen

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Klassen String Mer om fält Något om inläsning

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

OOP Objekt-orienterad programmering

Arrayer. results

Föreläsning 3. Iteration. while-satsen for-satsen do-satsen

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Tentamen OOP

I ett program hantera man ofta samlingar av objekt av samma typ.

Föreläsnings 9 - Exceptions, I/O

Lösningsförslag till tentamen

for-satsen Fält for-satsen Föreläsning 8 (OH-bilder 7) for-satsen for-sats är en styrsats för iterationer. for-sats har följande generella utseende:

Instuderingsfrågor, del E

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Föreläsning 3. Föreläsning 3. Iteration. while-satsen for-satsen do-satsen. while-satsen. do-satsen. Datatypen double

Iteration. Föreläsning 3. TDA540 - Objektorienterad Programmering

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Föreläsning 9-10 Innehåll

Föreläsning REPETITION & EXTENTA

Objektorienterad programmering

Föreläsning 6. Fält. Fält Klassen String. Fält

Föreläsning Innehåll. Hantera många element. Exempel: polygon Godtyckligt antal element. Exempel: polygon forts

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Objektorienterad programmering

Del A (obligatorisk för alla)

OOP Objekt-orienterad programmering

Objektorienterad programmering

Laboration 4: Digitala bilder

Parallellism, återblick

Testning och felhantering

Tentamen , Introduktion till Java, dtaa98, dtea53

Objektorienterad programmering i Java

Att skriva till och läsa från terminalfönstret

TENTAMEN OOP

Mer om klasser och objekt

Språkkonventioner och redigering av tal.

Objektorienterad programmering. Telefonboken igen, en bättre version. En jämförelse. Föreläsning 4

Föreläsning 3-4 Innehåll

TENTAMEN OOP

Föreläsning 7. Fält Klassen String

Iteration while-satsen

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Lösningsförslag till tentamen

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Objekt-orientering. Java är ett objekt-orienterat programmeringsspråk

Enkla variabler kontra referensvariabel

Lösningsförslag till tentamen

Fält och klassen String

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Del A (obligatorisk för alla)

OOP Objekt-orienterad programmering

Föreläsning 3. Föreläsning 3

Föreläsning 3. Föreläsning 3

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Föreläsning 3: Booleans, if, switch

Lösningsförslag: Instuderingsfrågor, del A

Föreläsning 3. Stack

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

F2 Datatyper och variabler. ID1004 Objektorienterad programmering Fredrik Kilander

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

TENTAMEN OOP

Skillnader mellan Python och Java

F4. programmeringsteknik och Matlab

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

public class BoundedCounter {

Hur ser ett Java-program ut?

Föreläsning 3. Stack

Algoritmer. Två gränssnitt

Laboration 3. Redovisning Uppgifterna skall vara demonstrerade och godkända av en handledare senast måndag 22/2.

Sammanfattning och repetition utgående från typiska tentamensuppgifter

Lösningsförslag till tentamen

OOP Objekt-orienterad programmering

Lösningsförslag till tentamen

DAT043 Objektorienterad Programmering

Lösningsförslag till tentamen

Transkript:

In- och utmatning av data Föreläsning 8 Textfiler Flerdimensionella fält ArrayList enum switch-satsen Utan att kunna läsa och skriva data skulle de flesta program vara ganska meningslösa. Den data som ett program är beroende av kan t.ex. ges via tangentbordet finnas i en fil hämtas från nätet vara utdata från ett annat program. Föreläsning 8 Ett program kan kan också behöva skriva/skicka data till dessa enheter. Java tillhandahåller ett flertal färdiga klasser för att underlätta I/Ohanteringen. Textfiler Flerdimensionella fält import java.util.scanner; class ReadFromKeyboard ArrayList static void main(string[] args) Scanner keyboard = new Scanner(System.in); System.out.print("Give the integer numbers: "); enum int sum = ; while (keyboard.hasnext()) switch-satsen sum = sum + keyboard.nextint(); Läsa data från tangentbordet I Java är tangentbordet kopplat till System.in, vilket är ett objekt av typen InputStream. För att underlätta läsningen kopplas System.in till ett Scanner-objekt. Konstruktorer Scanner(InputStream source) Constructs a new Scanner that produces values scanned from the specified input stream. Bytes from the stream are converted into characters. Läsa data från textfiler För att läsa från en textfil använder vi klasserna File och Scanner. Konstruktor File(String pathname) Creates a new File instance by converting the given pathname string into an abstract pathname. Konstruktor Scanner(File source) FileNotFoundException System.out.println("The sum of the numbers: " +throws sum); //main //ReadFromKeyboard import java.util.scanner; class ReadFromKeyboard static void main(string[] args) Scanner keyboard = new Scanner(System.in); System.out.print("Give the integer numbers: "); int sum = ; while (keyboard.hasnext()) sum = sum + keyboard.nextint(); System.out.println("The sum of the numbers: " + sum); //main //ReadFromKeyboard Constructs a new Scanner that produces values scanned from the specified file. Bytes from the file are converted into characters. Konstruktorn kastar ett en FileNotFoundException om den angivna filen inte finns. Detta är en s.k. kontrollerande exception som måste fångas eller kastas vidare.

Skriva till textfiler Läsa data från textfiler För att skriva till en textfil använder vi klassen PrintWriter. Konstruktor Kasta exception import java.util.scanner; vidare import java.io.file; import java.io.filenotfoundexception; class ReadFromTextFile static void main(string[] args) throws FileNotFoundException File in = new File("indata.txt"); Scanner sc = new Scanner(in); Kan resultera i FileNotFoundException int sum = ; while (sc.hasnext()) sum = sum + sc.nextint(); System.out.println("The sum is: " + sum); //main //ReadFromTextFile PrintWriter(String filename) throws FileNotFoundException Operationer void close() Creates a new PrintWriter, without automatic line flushing, with the specified file name. Closes the stream and releases any system resources associated with it. Prints an integer. Prints a double-precision floating-point number.. void print(int i) java.util.scanner; import java.io.printwriter; void print(double d) import java.io.file; java.io.filenotfoundexception; void println(int i) Prints an integer and then terminates the line. importclass java.io.filenotfoundexception; WriteToTextFile class static ReadFromTextFile void main(string[] args) throws FileNotFoundException static void main(string[] args) throws FileNotFoundException PrintWriter out = new PrintWriter("out.txt"); File infor = new (int ifile("indata.txt"); = ; i <= ; i = i + ) Scanner sc out.println(i); = new Scanner(in); int sum = ; while out.close(); (sc.hasnext()) Skriva till textfiler Tvådimensionella fält sum = sum + sc.nextint(); //main //WriteToTextFile exception System.out.println(Kasta "The vidare sum is: " + sum); import java.io.printwriter; import java.io.filenotfoundexception; //main class WriteToTextFile static void main(string[] args) throws FileNotFoundException //ReadFromTextFile Tvådimensionella fält är fält av fält. PrintWriter out = new PrintWriter("out.txt"); for (int i = ; i <= ; i = i + ) out.println(i); out.close(); //main //WriteToTextFile int[][] tabell = new int[][4]; Kan resultera i FileNotFoundException tabell

Tvådimensionella fält Tvådimensionella fält Istället för att skapa ett tvådimensionellt fält med new kan fältet skapas genom att initiera värden till fältet vid deklarationen. int[][] tabell =, 4, 7, 9, 5, 4,, 68, 9,,, 4; 4 7 9 5 4 68 9 4 Eftersom ett tvådimensionellt fält är ett fält med referenser till ett endimensionellt fält, kan raderna vara olika långa int[][] tabell =, 4, 7, 9, 9, ; 4 7 9 5 4 9 Problemexempel Skriv ett program som läser in en NxN matris, samt avgör och skriver ut huruvida matrisen är symmetrisk eller inte. Matrisens gradtal ges som indata. För en symmetrisk matris A gäller att aij = aji för alla i och j Analys: Indata: Ett gradtal samt en kvadratiskt matris med detta gradtal. Utdata: Utskrift av huruvida den inlästa matrisen är symmetrisk eller inte. Exempel: Matrisen 4 4 5 ger utskriften MATRISEN ÄR SYMMETRISK, medan matrisen 5 4 6 4 7 9 5 4 9 5, 4,, 5, 4,, 9, ; int[][] tabell =, 4, 7, 9, 5 7 ger utskriften MATRISEN ÄR INTE SYMMETRISK, medan matrisen tabell[].length ger 4 tabell[].length ger tabell[].length ger Arrays.sort(tabell[]) sorterar rad i tabell Arrays.sort(tabell[]) sorterar rad i tabell Arrays.sort(tabell[]) sorterar rad i tabell Design: Diskussion: När vi skall kontrollera om matrisen är symmetrisk utgår vi från att så är fallet. För att handha denna kunskap sätter vi en boolsk variabel, som vi kan kalla okey till värdet true. Sedan genomlöper vi matrisen och om vi då påträffar något element a ij för vilket det gäller att aij aji har vi en icke-symmetrisk matris. Detta kommer vi ihåg genom att sätta okey till värdet false. Algoritm:. Läs gradtalet n. Läs matrisen A. okey = true; 4. För varje element aij i matrisen A 4.. if (aij aji ) okey = false; 5. if okey Skriv ut Matrisen är symmetrisk.. else Skriv ut Matrisen är INTE symmetrisk.. Datarepresentation: A är av datatypen double[][].

Implementation: fortsättning Implementation: import javax.swing.joptionpane; class Symmetric static void main(string[] args) String input = JOptionPane.showInputDialog("Ange matrisens gradtal: "); int size = Integer.parseInt(input); double[][] matrix = readmatrix(size); if (issymmetric(matrix)) JOptionPane.showMessageDialog(null, "Matrisen är symetrisk!"); else JOptionPane.showMessageDialog(null, "Matrisen är INTE symetrisk!"); // main static double[][] readmatrix(int size) double[][] thematrix = new double[size][size]; for (int row = ; row < size; row = row + ) for (int col = ; col < size; col = col + ) String input = JOptionPane.showInputDialog("Ge element (" + row + ", " + col + ")"); thematrix[row][col] = Double.parseDouble(input); thematrix; // readmatrix static double[][] readmatrix(int size) double[][] thematrix = new double[size][size]; for (int row = ; row < size; row = row + ) //before: matrix!= null java.util.scanner; static boolean issymmetric(double[][] matrix) for import (int col = ; col < size; col = col + ) import javax.swing.joptionpane; boolean okay = true; for (int row = ; row = JOptionPane.showInputDialog("Ge element ("<+matrix.length; row +row ",="row++ )col + ")");... input String class Symmetric for (int col = ; col < matrix[row].length; col = col + ) if (matrix[row][col]!= matrix[col][row]) thematrix [row][col] = Double.parseDouble(input); readmatrix(int = false; staticstatic voiddouble[][] main(string[] args) size) okay okay; double[][] thematrix = new double[size][size ]; //issymmetric matrisens gradtal: "); input = JOptionPane.showInputDialog("Ange //Symmetric StringSystem.out.print( "Ge element: "); int size = Integer.parseInt(input); thematrix ; = new Scanner(System.in); Scanner sc double[][] // readmatrix for (intmatrix row = = ; readmatrix(size); row < size; row = row + ) for (int col = ; col < size; col = col + ) if (issymmetric(matrix)) //before:joptionpane.showmessagedialog(null, matrix!= thematrix[row][col] null = sc.nextdouble(); "Matrisen är symetrisk!"); Alternativ implementation av metoden readmatris, med användning av ett Scanner static boolean issymmetric(double[][] matrix) Flerdimensionella fält objekt och inläsning från System.in: else boolean okay = true; Man kan ha ett godtyckligt antal dimensioner i ett fält, dvs man kan bilda fält JOptionPane.showMessageDialog(null, "Matrisen är INTE symetrisk!"); for (int row = ; row < matrix.length; row = row + ) av fält av fält av fält av. thematrix; //formain col = ; col < matrix[row].length; col = col + ) import java.util.scanner; (int // readmatrix int[][][] cube = new int[][][4]; if (matrix[row][col]!= matrix[col][row]) static double[][] readmatrix(int size) double[][] thematrix = new double[size][size]; okay = false; System.out.print( "Ge element: "); Scanner sc = new Scanner(System.in); okay; cube for (int row = ; row < size; row = row + ) for (int col = ; col < size; col = col + ) //issymmetric thematrix[row][col] = sc.nextdouble(); //Symmetric thematrix; // readmatrix

Flerdimensionella fält En bild kan lagras som ett tvådimensionellt fält av bildpunkter (eller pixels). I en gråskalebild är varje bildpunkt ett heltal i intervallet [, 55], där betecknar svart och 55 betecknar vitt. I en färgbild utgörs varje bildpunkt av tre heltal i intervallet [, 55], som representerar intensiteten av färgerna rött, grönt respektive blått. En gråskalebild respektive en färgbild med höjden 8 pixels och bredden 6 pixels avbildas således enligt: int[][] grayimage = new int[8][6]; int[][][] colorimage = new int[8][6][]; Klassen ArrayList Ett fält är en statisk datastruktur, vilket innebär att storleken på fältet måste anges när fältet skapas. Detta innebär att fält inte är särskilt väl anpassade för att handha dynamiska datasamlingar, dvs datasamlingar som under sin livstid kan variera i storlek. För att handha dynamiska datasamlingar i ett fält måste man själv utveckla programkod för att t.ex: - ta bort ett element ur fältet - lägga in ett nytt element på en given position i fältet - öka storleken på fältet om ett nytt element inte ryms. Klassen ArrayList är en standardklass (av flera) för all handha samlingar av objekt. Särskilt när vi handhar dynamiska datasamlingar, är det lämpligt att använda klassen ArrayList istället för ett endimensionellt fält. ArrayList finns i paketet java.util. Klassen ArrayList<E> Klassen ArrayList<E> Metod Metod int size() erar antalet element i listan ArrayList<E>() skapar en tom ArrayList för element av typen E. boolean isempty() void add(e elem) lägger in elem sist i listan (d.v.s. efter de element som redan finns i listan). erar true om listan är tom, annars eras false int indexof(e elem) erar index för elementet elem om detta finns i listan, annars eras - void add(int pos, E elem) lägger in elem på plats pos. Efterföljande element flyttas en position framåt i listan. boolean cointains(object elem) erar true om elem finns i listan, annars eras false E get(int pos) erar elementet på plats pos. void clear() tar bort alla elementen i listan E set(int pos, E elem) ersätter elementet på plats pos med elem, erar elementet som fanns på platsen pos. String tostring() erar en textrepresentation på formen [e, e,..., en] E remove(int pos) tar bort elementet på plats pos, erar det borttagna elementet. Efterföljande element i listan flyttas en position bakåt i listan. Anm: Metoderna indexof och cointains förutsätter att objekten i listan kan jämföras, d.v.s. klassen som objekten tillhör måste definiera metoden boolean equals(object obj) Alla standardklasser, såsom String, Integer och Double, definierar metoden equals.

Klassen ArrayList Klassen ArrayList är en generisk klass. Detta innebär att när man skapar en lista av klassen ArrayList måste man ange en typparameter som specificerar vilken typ av objekt som skall lagras lagras i listan. Exempel: ArrayList<String> words = new ArrayList<String>(); ArrayList<Integer> values = new ArrayList<Integer>(); ArrayList<BigInteger> bigvalues = new ArrayList<BigInteger>(); ArrayList<Person> members = new ArrayList<Person>(); Autoboxing och auto-unboxing Typomvandling sker automatiskt mellan primära datatyper och motsvarande omslagsklass. Detta kallas för autoboxing respektive auto-unboxing. Istället för att skriva Integer talobjekt = new Integer(); int tal = talobjekt.tovalue(); kan man for-satsen skriva Genomlöpning av hela samlingarna med den vanliga I en ArrayList kan man endast spara objekt, dvs. en ArrayList kan inte innehålla de primitiva datatyperna (t.ex. int, double, boolean och char). Integer talobjekt = ; int tal = talobjekt; double[] values = new double[]; ArrayList<String> listan = new ArrayList<String>(); for (int index = ; index < values.length; index = index +) System.out.println(values[index]); Vill man handha primitiva datatyper med hjälp av en ArrayList måste man lagra objekt av motsvarande omslagsklass. //autoboxing //auto-unboxing for (int pos = ; pos < listan.size(); pos = pos +) System.out.println(listan.get(pos)); Förenklad for-sats Problemexempel Genomlöpning av hela samlingarna med den förenklade for-satsen När man vill löpa igenom alla objekt i en samlingar (t.ex. ett objekt av ArrayList eller ett en-dimensionellt fält) finns den förenklade for-satsen. Skriv en metod double[] values = new double[]; ArrayList<String> listan = new ArrayList<String>(); static ArrayList<Integer> readlista() double[] values = new double[];... ArrayList<String> listan = new ArrayList<String>(); som läser in en indatasekvens består av osorterade heltal från standard input for (int index = ; index < values.length; index =for index +) (double v : values) och erar dessa i en ArrayList. I indatasekvensen kan samma tal System.out.println(values[index]); förekomma flera gånger, men i listan skall endast den första förekomsten av System.out.println(v); for (int pos = ; pos < listan.size(); pos = pos +) varje unikt tal skall lagras. Genomlöpning av hela samlingarna med den vanliga for-satsen System.out.println(listan.get(pos)); for (String str : listan) System.out.println(str); double[] values = new double[]; Genomlöpning av hela samlingarna med den förenklade for-satsen ArrayList<String> listan = new ArrayList<String>(); for (double v : values) System.out.println(v); for (String str : listan) System.out.println(str); Exempel: Antag att indatasekvensen består av talen 4 4 5 4, ett anrop av metoden readlist skall då era en lista som innehåller talen, 4,, 5, och.

Klassen PhoneBook implementerad med fält Algoritm:. while (fler tal att läsa).. läs talet.. if (talet inte finns i listan ) lagra talet i listan;. era listan Maximal storlek måste anges class PhoneBook Entry[] book; class Entry int count; String name; PhoneBook(int size) String number; book = new Entry[size]; Entry(String name, String number) Antalet element count = ; this.name = name; måste bokföras //constructor this.number = number; import java.util.arraylist; class PhoneBook static ArrayList<Integer> readlist() void put(string name, String nr) //constructor class PhoneBook Entry[] book; ArrayList<Integer> list = new ArrayList<Integer>(); classbook[count] Entry =new Entry(name, nr); String getname() count = count + ; book = new ArrayList<Entry>(); Scanner in = new Scanner(System.in); intarraylist<entry> count; name; //put String name; while (in.hasnextint()) //getname PhoneBook() size) String get(string name) int value = in.nextint(); PhoneBook(int String getnumber() String for (int i = ;number; i < count; i = i +) if (!list.contains(value)) number; book = new ArrayList<Entry>(); if (name.equals(book[i].getname())) book = new Entry[size]; //getnumber list.add(value); class Entry name, String book[i].getnumber(); Entry(String number) //Entry //constructor null; count = ; String //get this.name = name; name; list; //PhoneBook //constructor void put(string name, String nr) String number; //readlist this.number = number; book.add(new Entry(name, nr)); static ArrayList<Integer> Entry(String name, String number) void put(string name, String nr) readlist() //constructor //put book[count] = new Entry(name, this.name = name; ArrayList<Integer> list nr); = new ArrayList<Integer>(); String getname() count String =Scanner countget(string + in ; = new name) this.number Scanner(System.in); name;= number; //putfor (Entry //constructor : book) whilee(in.hasnextint()) //getname ifimplementation (name.equals(e.getname())) Klassen PhoneBook ArrayList Uppräkningstyper - enum String get(string String StringgetNumber() getname() int valuemed=name) in.nextint(); for (int i =if;(!list.contains(value)) i <e.getnumber(); count; i = i +) I blandname; vill man kunna använda variabler som endast skall kunna anta vissa import java.util.arraylist; number; givna värden: null; class PhoneBook if (name.equals(book[i].getname())) //getname ArrayList<Entry> book = new ArrayList<Entry>(); //getnumber gender: MALE, FEMALE //get list.add(value); PhoneBook() book[i].getnumber(); state: READY, RUNNING, BLOCKED, book = new ArrayList<Entry>(); String getnumber() DEAD //Entry class Entry //constructor //PhoneBook suit: HEARTS, SPADES, DIAMONDS, CLUBS null; String name; number; void put(string name, String nr) String number; season: WINTER, SPRING, SUMMER, FALL book.add(new //getentry(name, nr)); Entry(String name, String number) //getnumber //put bearing: NORTH, WEST, SOUTH, EAST = name; list;this.name String get(string name) this.number = number; //PhoneBook //Entry Implementation //readlist for (Entry e : book) if (name.equals(e.getname())) e.getnumber(); null; //get //PhoneBook //constructor String getname() name; //getname String getnumber() number; //getnumber //Entry I Java kan detta göras genom att deklarera särskilda uppräkningsklasser: enum suit enum inte class HEARTS, SPADES, DIAMONDS, CLUBS; //suit Räkna upp alla värden (instanser) typen skall ha

Uppräkningstyper - enum Varje deklarerat (uppräknat) värde i en enum är en instans av klassen. Varje värde är implicit, static och final, alltså en klasskonstant. Lägga till tillstånd på enum-konstanter Eftersom enum definierar en klass kan man ge tillstånd och beteenden till objekten som tillhör en uppräkningstyp, Tillståndet hos en instans beskrivs med hjälp av instansvariabler. Metod Tillståndet för en instans ges som argument till instansen. int compareto(e obj) erar ett negativt heltal om aktuellt objekt är mindre än argumentet obj, om aktuellt objekt och argumentet obj är lika och ett positivt heltal om aktuellt objekt är större än argumentet obj. Jämförelsen görs efter den ordning objekten har deklarerats En konstruktor för att initiera tillståndet behöver definieras. Konstruktorn får/kan inte vara. boolean equals(e obj) erar true om obj är lika med aktuellt objekt, annars eras false String name() erar namnet på aktuellt objekt (enligt deklarationen) int I ordinal() erar ordningstalet för aktuellt objekt (enligt deklarationen) String tostring() erar namnet på aktuellt objekt (enligt deklarationen) static E valueof(string str) erar objektet med det angivna namnet static E[] values() erar ett fält innehållande objekten i klassen Lägga till beteenden på enum-konstanter enum enum DayOfWeek DayOfWeek MONDAY, MONDAY,TUESDAY, TUESDAY,WEDNESDAY, WEDNESDAY,THURSDAY, THURSDAY, FRIDAY, FRIDAY, SATURDAY, SATURDAY, SUNDAY; SUNDAY; int int nrinweek() nrinweek() this.ordinal() this.ordinal() ++ ; ; //nrinweek //nrinweek DayOfWeek DayOfWeek tomorrow() tomorrow() DayOfWeek[] DayOfWeek[] days days == DayOfWeek.values(); DayOfWeek.values(); days[(this.ordinal() days[(this.ordinal() ++ ) ) % % days.length]; days.length]; //tomorrow //tomorrow DayOfWeek DayOfWeek yesterday() yesterday() DayOfWeek[] DayOfWeek[] days days == DayOfWeek.values(); DayOfWeek.values(); days[(this.ordinal() days[(this.ordinal() -- ) ) % % days.length]; days.length]; //yesterday //yesterday static static DayOfWeek DayOfWeek getdaywithnr(int getdaywithnr(int daynr) daynr) DayOfWeek[] DayOfWeek[] days days == DayOfWeek.values(); DayOfWeek.values(); days[daynr days[daynr -- ]; ]; //getdaywithnr //getdaywithnr //DayOfWeek //DayOfWeek Argument som anger tillståndet enum enum Customer Customer CHILD(5), CHILD(5), ADULT(), ADULT(), SENIOR(6); SENIOR(6); int int price; price; Customer(int Customer(int price) price) this.price this.price == price; price; //constructor //constructor int int getprice() getprice() price; price; //getprice //getprice //Customer //Customer switch-satsen En switch-sats är en selekteringssats med flervalsalternativ. Returnerar vilket ordningsnummer i veckan Den aktuell dagen har Returnerar dagen efter aktuell dag Returnerar dagen före aktuell dag Returnerar dagen med ordningsnummer daynr i veckan Konstruktor som sätter tillståndet Varje alternativ beskrivs av en case-sats; som består dels av ett case-uttryck, dels av de som anger vad som skall göras om alternativet inträffar. I switch-satsen testas värdet av ett uttryck (expression) mot ett antal givna case-uttryck (value, value, ). Uttrycket (expression) måste vara en heltalstyp, typen char eller en uppräkningstyp (enum). case-uttrycken måste ha samma typ som expression. case-uttrycken måste ha olika värden. switch-satsen kan innehålla ett default-alternativ, som avser de möjliga alternativ som inte anges i ett eget case-uttryck Syntax: switch (expression) case value: case value: case value:...(more cases)... default:

switch-satsen Först evalueras uttrycket expression. Det erhållna värdet jämförs med värdena av caseuttrycken. Om det finns ett case-uttryck som har samma värde som expression, sker ett hopp till den sats som följer efter detta case-uttryck. Annars sker ett hopp till satsen efter default-alternativet (om ett sådant finns). switch-satsen: Flödesscheman Syntax: switch (expression) case value: case value: case value:...(more cases)... default: uttryck value value value value5 value4 enum DayOfWeek MONDAY,TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; Exekveringen. av..en case-sats, forsätter förbi andra case-uttryck tills switch-blocket är slut eller tills ett//dayofweek break-uttryck påträffas. static void tellitlikeitis(dayofweek day) Flera case-uttryck kan således finnas framför ett Shorthand uttryck switch (day)motsvarand visst alternativ. case MONDAY: Oops: om man glömmer ++x x+ break körs bad."); även System.out.println("Mondaysnästa are case. --x x- case FRIDAY: x++ x+ System.out.println("Fridays are better."); x-x- case SATURDAY: switch-satsen: Exempel Shorthand operatorer x += y x+y case SUNDAY: x = I Java finns ett antal shorthand operatorer. enum DayOfWeek för are increment och decrement, både i en prefix och i en postfix best."); xthursday, -= y FRIDAY, SATURDAY, SUNDAY;System.out.println("Weekends x =Dels xfinns-delsoperatorer yfinns sammansatta MONDAY,TUESDAY, WEDNESDAY, version, tilldelningsoperatorer. static void tellitlikeitis(dayofweek day) //DayOfWeek Motsvarand uttryck switch (day) y x *= x = x *Shorthand y default: case MONDAY: ++x x+ System.out.println("Mondays are bad."); System.out.println("Midweek days are so-so."); x- x/= y x = x / y --x case FRIDAY: x++ x+ System.out.println("Fridays are better."); Utförs för SATURDAY x-x- och SUNDAY //tellitlikeitis case SATURDAY: Utförs för TUESDAY, WEDNESDAY och THURSDAY case SUNDAY: System.out.println("Weekends are best."); default: System.out.println("Midweek days are so-so."); //tellitlikeitis uttryck value value value x += y x=x+y x -= y x *= y x=x-y x=x*y x /= y x=x/y value4 value5

Shorthand operatorer Efter som operatorerna ++ och -- ändrar värdet på en variabel måste man vara observant om man använder dessa operatorer i kombination med en tilldelningsoperator. Betrakta nedanstående : firstnumber = ; secondnumber = ++firstnumber; Efter att na har utförts har både variabeln fistnumber och secondnumber värdet. När däremot följande exekveras firstnumber = ; secondnumber = firstnumber++; Har variabeln fistnumber värdet och variabeln secondnumber värdet. Prefixoperatorn (++i) utförs före tilldelningsoperatorn, medan postfixoperatorn (i++) utförs efter tilldelningsoperatorn. Använd shorthand operatorerna med med försiktighet!