EDAA20 Föreläsning 11-12 Klassen ArrayList Klassen ArrayList Skriva program som läser data från en textfil och skriver data till en textfil Repetition inför delmålskontroll 2 är en standardklass (i paketet java.util). innehåller alltid objekt (inte int, double,... ). lagrar sina element i en vektor. utökar vektorns storlek vid behov. har metoder för att sätta in och ta bort element... Avsnitt i läroboken: 7.8-7.9, 12.1-2, 12.8 Avsnitt 12.6 och 12.10 ingår inte i kursen, men är bra att läsa om du fortsätter med programmering på egen hand eller i någon annan kurs. 191 192 Viktiga operationer på ArrayList Generisk klass ArrayList<E>(); E get(int pos); void add(e obj); // konstruktor // elementet på plats pos // lägger in obj sist void add(int pos, E obj); // Lägger in obj på plats pos. // Efterföljande element flyttas. E remove(int pos); int size(); // Tar bort elementet på plats // pos, returnerar det borttagna // elementet. // antalet element En ArrayList är en generisk klass och kan innehålla objekt av godtycklig typ. Ersätt E med typen på de objekt som ska lagras i listan. Exempel där vi skapar en lista som kan innehålla Point-objekt och sätter in tre punkter i listan: ArrayList<Point> vertices = new ArrayList<Point>(); vertices.add(new Point(50, 50)); Vertices.add(new Point(50, 10)); Vertices.add(new Point(30, 40)); boolean isempty(); // true om listan är tom void clear(); // Tar bort alla element. 193 194
Övning Arraylist Traversera alla elementen i listan vertices Antag att en variabel list refererar till ett ArrayList-objekt. Mönster: x 50 Y 50 x 50 Y 10 x 30 Y 40 for (int i = 0; i < list.size(); i++) { // här kan elementet list.get(i) användas I klassen Point finns metoden: void move(int dx, int dy)! Skriv programkod för att flytta punkterna 10 i x-led och 20 i y-led: Anm. Detta sätt att traversera en lista fungerar bra då man använder en ArrayList. I Java finns flera olika klasser för att hålla reda på en samling med element. Om man använder en annan samlingsklass passar inte ovanstående sätt att traversera genom elementen. Man får använda en iterator istället (avsnitt 12.10). 196 Polygon med ArrayList, del 1 Polygon med ArrayList, del 2 public class Polygon { private ArrayList<Point> vertices; /** Skapar en polygon. */ public Polygon() { vertices = new ArrayList<Point>(); /** Definierar en ny punkt med koordinaterna x, y. */ public void addvertex(int x, int y) { vertices.add(new Point(x, y)); 197 /** Flyttar polygonen avståndet dx i x-led, dy i y-led. */ public void move(int dx, int dy) { for (int i = 0; i < vertices.size(); i++) { vertices.get(i).move(dx, dy); /** Ritar polygonen i fönstret w. */ public void draw(simplewindow w) { if (vertices.size() == 0) { return; Point start = vertices.get(0); w.moveto(start.getx(), start.gety()); for (int i = 1; i < vertices.size() ; i++) { w.lineto(vertices.get(i).getx(), vertices.get(i).gety()); w.lineto(start.getx(), start.gety()); 198
Polygon med ArrayList, del 3 ArrayList kan bara innehålla objekt /** Lägger in en ny punkt med koordinaterna x,y på plats pos. Efterföljande element flyttas */ public void insertvertex(int pos, int x, int y) { vertices.add(pos, new Point(x, y)); /** Tar bort punkten på plats pos. Efterföljande element flyttas */ public void removevertex(int pos) { vertices.remove(pos); Om man vill lagra heltal, reella tal etc. måste man använda motsvarande typklass: inte ArrayList<Integer> list = new ArrayList<Integer>(); list.add(2); ArrayList<int> list = new ArrayList<int>; 199 200 Typklasser Autoboxing - unboxing Enkla datatyper i Java motsvarande typklasser boolean Boolean int Integer double Double char Character Automatisk konvertering mellan enkel datatyp och motsvarande typklass. Exempel: Integer i = 12; // Autoboxing till Integer-objekt i = i + 1; // Unboxing av i för att beräkna i+1. // Därefter autoboxing av resultatet. ArrayList<Integer> list = ArrayList<Integer>(); list.add(12); // Autoboxing int n = list.get(0); // Unboxing 201 202
Typklassen Integer - exempel Sökoperationer på ArrayList Observera skillnaden mellan datatypen int (enkel datatyp) och Integer (klass). int a = 12; Integer b = 12; a 12 b! b är en referensvariabel som kan referera till ett Integer-objekt. 12 203 Det finns färdiga metoder för att söka i en lista: /** Söker upp ett element som matchar obj. Returnerar true om sådant element element finns, annars false. */ boolean contains(object obj); /** Söker upp ett element som matchar obj. Returnerar index för elementet, -1 om elementet inte fanns. */ int indexof(e obj); Varning: Dessa metoder förutsätter att det finns en metod public boolean equals(object obj) i klassen som ersätter E (avsnitt 12.6). Du kan alltså inte använda dessa metoder för att söka i listan om du inte sett till att det finns en korrekt equals-metod i den klass som ersätter E.! En equals-metod finns i Javas typklasser samt i klassen String.! 204 Övning sökning Algoritmexempel: insättning i sorterad följd Lägg till följande metod i klassen Polygon: /** Undersöker om polygonen har någon hörnpunkt med koordinaterna x, y. */ boolean hasvertex(int x, int y) { Ett ArrayList-objekt wordlist är deklarerad och skapad enligt följande: ArrayList<String> wordlist= new ArrayList<String>(); // Här läggs ett antal ord in i words. Orden är sorterade i stigande ordning. wordlist "apelsin" "banan" "druva" "enbär" Uppgift: Lägg till ordet word i den redan sorterade listan. 205 word "citron" 206
Insättning i sorterad följd lösning Inläsning från tangentbordet Lösning: Sök efter platsen för word, d.v.s. sök efter det första ord som är större word. Lägg in word i listan: int pos = 0; while (pos < wordlist.size() && wordlist.get(pos).compareto(word) < 0) { pos++; wordlist.add(pos, word); wordlist "apelsin" "banan" "citron" "druva" "enbär" För att läsa det användaren skriver på tangentbordet använder man ett Scanner-objekt: public class ScannerExample1 { public static void main(string[] args) { Scanner scan = new Scanner(System.in); int sum = 0; while (scan.hasnextint()) { sum = sum + scan.nextint(); System.out.println("Summa: " + sum); 207 208 Inläsning från fil try-catch-sats Man kan också koppla Scanner-objektet till en textfil: public class ScannerExample2 { public static void main(string[] args) { Scanner scan = null; try { scan = new Scanner(new File("indata.txt")); catch (FileNotFoundException e) { System.out.println("Filen kunde inte öppnas"); System.exit(1);... läs som tidigare När man försöker öppna en fil måste man använda en try-catch-sats. Man försöker öppna filen. Om det går bra fortsätter exekveringen efter try-catch-satsen. I annat fall utförs satserna i catch-blocket. try { // Här försöker vi öppna filen indata.txt scan = new Scanner(new File("indata.txt")); catch (FileNotFoundException e) { // Här kan man skriva vad som ska hända om // filen inte kan öppnas. 209 210
Utskrift på fil Delmål 2 exempel på vad du ska kunna public class PrintWriterExample { public static void main(string[] args) { PrintWriter out = null; try { out = new PrintWriter(new File("utdata.txt")); catch (FileNotFoundException e) { System.out.println("Filen kunde inte öppnas"); System.exit(1);... utskrifter med out.print hamnar på filen out.close(); Förklara följande begrepp: vektor, matris, teckensträng, generisk klass. Använda vektorer och matriser. Använda klasserna String och StringBuilder. Använda klassen ArrayList. Tillämpa algoritmen för linjärsökning. Implementera och använda klasser (större än i delmål 1). 211 212 Repetition klasser och objekt På föreläsning 12 blir det repetition inför delmålskontroll 2. Det vi ska repetera är framförallt: ArrayList! vektorer Material till denna repetitionsföreläsning delas ut separat. 213