TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2 Laboration 2 Datastrukturer En liten uppgift Frågor 1
Laboration 2 - Datastrukturer Länkade datastrukturer Stack Kö (En. Queue) Lista Generiska klasser Iteratorer Paket Exceptions 2
Laboration 2 Datastrukturer (forts.) En stormarknad med kunder som kommer och handlar varor och går till kassan. Använder: Stack: Lägga i och ta upp varor ur varukorgen Kö: Kunder som står vid kassan Lista: Hålla reda på kunderna 3
Laboration 2 Datastrukturer (forts.) Uppgiften Implementera ett paket som heter myutil som innehåller följande generiska klasser: MyStack MyQueue MyList (ska kunna returnera en instans av MyListIterator) MyListIterator implements java.util.iterator Använd testprogrammet Stormarknad för att testa att dina klasser fungerar. 4
Laboration 2 Datastrukturer (forts.) MyList Ska vara en enkellänkad lista" MyList<E> implements Iterable<E> metoder public void add(e element) // Adds element public E getrandomelement() // Gets element, doesn t remove public boolean isempty() // Checks if empty public int size() // Returns data count public Iterator<E> iterator() // Gets iterator for list MyListIterator MyListIterator<E> implements Iterator<E> metoder public boolean hasnext() // Checks if there is more data public E next() // Gets next data public void remove() // Removes last gotten data 5
Laboration 2 Datastrukturer (forts.) MyStack MyStack<E> metoder public void push(e element) // Adds data public E pop() // Returns & removes topmost data public boolean isempty() // Checks if empty public int size() // Returns data count MyQueue MyQueue<E> metoder public void enqueue(e element) // Adds data public E dequeue() // Returns & removes front data public boolean isempty() // Returns data count public int size() // Returns data count Utöver detta kommer det att behövas en nod-klass, konstruktorer för klasserna, och antagligen en del privata hjälpfunktioner.. 6
Del 1: Dagens Uppgift I klassen Calculator, implementera en statisk funktion product som beräknar produkten av en samling med heltal, som ges som inparameter. Uttrycket finns som en stack (d.v.s. en stack), med datatypen Integer. Resultatet ska returneras som en int. Rekursion får ej användas. 7
Del 2: Dagens Uppgift Gör om stack-klassen (och nod-klassen) till generiska klasser. Gör nödvändiga ändringar i Calculator så att den fungerar igen. 8
Iterator Iteratorer används för att effektivt löpa igenom element i en datasamling Exempel List<Integer> li = new LinkedList<Integer>(); for (int i=0; i<li.size()-1; ++i) { } Integer x = li.get(i); System.out.println(x); for (Iterator<Integer> it = li.iterator(); it.hasnext(); ) { } Integer x = it.next(); System.out.println(x); 9
Iterator (forts.) Att skriva sin egna iterator-klass för en egendefinierad container-klass MyContainer Exempel import java.util.iterator; public class MyContainerIterator<E> implements Iterator<E> { // Några instansvariabler (bl.a. en referens till det objekt // som vi ska iterera över, MyContainer) } public MyContainerIterator(MyContainer<E> container) { } public boolean hasnext() { } public E next() { } public void remove() { } 10
Paket Paket används för att organisera klasser som hör ihop package mypackage; Högst upp i varje fil som tillhör paketet mypackage Skapa paket i Eclipse File->New->Package Ange namn på det nya paketet (mypackage) Flytta källkodsfilerna (.java) till det nya paketet m.h.a. Refactoring Markera den fil du vill flytta Refactor->Move Välj det nya paketet import mypackage.*; Importerar alla klasser ur det nya paketet Paket motsvaras av kataloger i filsystemet 11
Exceptions För att på ett snyggt sätt fånga upp fel som kan förekomma i programmet och på så sätt undvika att det avbryts eller göra tydliga felmeddelanden. Exempel på fel som kan generera ett undantag Divison med 0 Läsning av en fil som inte finns Indexering utanför fältgränser Att fånga upp ett fel int[] a = new int[100]; for (int i = 0; i <= 100; ++i) { } a[i] = 0; -> Programmet avbryts och följande skrivs ut: Java.lang.ArrayIndexOutOfBoundsException: 100. 12
Exceptions (forts.) Använd try-catch för att fånga upp undantag int[] a = new int[100]; try { for (int i = 0; i <= 100; ++i) { a[i] = 0; } } catch(exception e) { System.out.println( Exception + e.getmessage()); } Programmet fortsätter att exekveras efter undantaget! 13