Institutionen för Datavetenskap Göteborgs universitet HT2008 DIT011 Objektorienterad programvaruutveckling GU (DIT011) Innehåll Föreläsning 4 Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap. Föreläsning 4 Katarina Blom 1 2 Array Lists Klassen ArrayList (i paket java.util) lagrar listor av objekt, och kan användas istället för fält. I ArrayList finns bla metoder för att sätta in och ta bort element ur listor. Längden på listan i ArrayList är dymaisk. (Fält har en fix längd). För att skapa ett objekt av ArrayList, använd en av konstruktorerna i klassen: ArrayList<PointD> acc = new ArrayList<PointD>(); För att använda ett ArrayList-objekt; anropa metoder som finns att tillgå: acc.add(new PointD(2,3)); acc.add(new PointD(-3,4)); acc.add(new PointD(9,10)); int no = acc.size(); PointD elem = acc.get(1); Sökning och sortering Beräkna antal element som uppfyller ett visst villkor: Löp igenom alla element i listan, om vilkoret är uppfyllt uppdatera en räknare. double r = 5;... int matches = 0; for(int i=0; i<acc.size(); i=i+1){ PointD a = acc.get(i); if((a.getx()*a.getx()+a.gety()*a.gety())<r*r) matches = matches+1; Sök ett värde: Löp igenom elementen i listan; avsluta när en träff hittats. int r = 3;... PointD a = null; for(int i=0; i<acc.size();i=i+1){ a = acc.get(i); if(a.getx()*a.getx()+a.gety()*a.gety()<r*r) break; a = null; 3 4
Sök efter största/minsta element: Inititera ett startelement, sök sedan igenom alla element och uppdatera startelementet ifall ett större/mindre element påträffas. PointD largestyet = acc.get(0); for(int i=1; i<acc.size(); i=i+1){ PointD a = acc.get(i); if(a.getx() > largestyet.getx()) largestyet = a; Sortera listan med avseende på punkternas X-koordinater: ArrayList<PointD> sortedacc; sortedacc = new ArrayList<PointD>(); while(acc.size()>0){ PointD largestyet = acc.get(0); for(int i=1; i<acc.size(); i=i+1){ PointD a = acc.get(i); if(a.getx() > largestyet.getx()) largestyet = a; sortedacc.add(largestyet); acc.remove(largestyet); Klassen PointD (från Lab1) beskriver en punkt i planet: public class PointD{ private double x,y; public PointD(){ this(0.0,0.0); public PointD(double x, double y){ this.x = x; this.y = y; public double getx(){ return x; public double gety(){ return y; public String tostring(){ return "("+x+","+y+")"; 5 6 Om en lista är sorterad kan man använda binärsökning: public static int binsearch(string[] a, String x){ int start=0; int slut=a.length-1; int mitten; while(start<=slut){ mitten=(start+slut)/2; if(a[mitten].compareto(x)<0) start = mitten+1; else if(a[mitten].compareto(x)>0) slut = mitten-1; else{ return mitten; return -1; Mängder av naturliga tal Definiera en klass vars objekt är mängder av naturliga tal. Metoder som ska finnas public void insert(int n) public void remove(int n) public boolean ismember(int n) Hur bör talmängden lagras? 7 8
Förslag? oarraylist o Fält av heltal o Ett boolskt fält o Fler förslag? Ett boolskt fält Mängden {1,4 representeras av: false 0 true 1 false 2 false 3 true 4 Fördelar/nackdelar med respektive lagringsform? 1 och 4 ingår 0, 2 och 3 ingår inte. Mängden är uppåt begränsad av 4 Fördelar/Nackdelar med representationen? En bra representation om man kan ange en övre gräns för vilka tal som kan förekomma. Var anges denna gräns? 9 10 Klassen NatSet public class NatSet{ private boolean[] elems; public NatSet(int max){ elems = new boolean[max+1]; public void insert(int n){ elems[n] = true;... En förbättrad version av insert public void insert(int n){ checkrange(n); elems[n] = true; private void checkrange(int n){ if(n<0 n>elems.length) throw new IllegalArgumentException(); Vilka förvillkor gäller för parametern till insert? 11 12
Vilket är det största primtalet mindre än 10 000 000? o Bilda mängden av alla primtal mindre än 10 000 000. o Det sökta talet är det största elementet i denna mängd. Erathostenes såll För att hitta alla primtal mindre än 50 1: Skriv upp alla tal mellan 2 och 50, och ringa in 2. 2: Stryk alla multipler av det inringade talet. 3: Ringa in första ej inringade eller strukna tal. 4: Upprepa 2 och 3 tills??? 13 14 Erathostenes såll i java private static NatSet primesto(int n){ NatSet result = new NatSet(n); for(int i=2; i<=n; i++) result.insert(i); int p = 2; while(p<=(int)math.sqrt(n)){ Besvara frågan public static void main(string[] arg){ int n = Integer.parseInt(arg[0]); NatSet primes = primesto(n); while(!primes.ismember(n)) n--; System.out.println(n); for(int k=2; k*p<=n; k++) result.remove(k*p); p++; while(!result.ismember(p)) p++; return result; 15 16
Dokumentation Man bör kommentera (och dokumentera) sin kod. Använd javadoc Publika metoder dokumenteras med dokumentationskommentarer. Beskriv kort vad metoden gör, vad den returnerar och hur den anropas (dvs. vad ev. inparametrar betyder). Publika variabler och konstanter dokumenteras med dokumentationskommentarer. Beskriv kort vad variabeln eller konstanten står för. Privata metoder, variabler och konstanter kommenteras för att öka förståelsen av koden för en eventuell läsare. Dessa kommentarer ska inte vara dokumentationskommentarer utan vanlig kommentarer. Avbildning, en speciell sorts lista En klass för att lagra <nyckel,värde>par för att senare kunna slå upp värdet givet nyckeln. Varje nyckel kan bara avbildas på ett värde. Ett svensk-engelskt lexikon. Lagra de svenska orden (nyckeln) i par med sin engelska översättning (värdet). Ett bilregister. Registreringsnummret är nyckeln. Informationen om bilen och bilägaren utgör värdet. En diskret funktion: Lagra <x,f(x)>. I Java finns tex. klassenhashmap för avbildningar. 17 18 En klass för att lagra bilinformation public class BilInfo{ private String regnr; private String info; public BilInfo(String key, String value){ regnr = key; info = value; public String getkey(){ return regnr; public String getinfo(){ return info; Klassen Bilregister (början) public class Bilregister{ private BilInfo[] entry; private int storl; public Bilregister(int maxstorl){ entry = new BilInfo[maxstorl];... Typiska metoder för avbildningar: Sätt in <nyckel,värde>-par i avbildningen: public void insert(string key, String value) Sök efter ett värde givet nyckeln: public String find(string key) 19 20
Metoden insert private int findindex(string key){ for(int i=0;i<storl;i++){ if(entry[i].getkey().equals(key)) return i; return storl; public void insert(string k, String v){ int i = findindex(k); if(i==storl) storl++; entry[i]=new BilInfo(k,v); Vad gör man vid insättning om det redan finns ett par med samma nyckel? Ett expanderbart bilregister Om fältet entry blir fullt, allokera ett nytt dubbelt så stort fält och kopiera datan dit. private void dubblera(){ BilInfo[] ny = new BilInfo[2*entry.length]; for(int i=0;i<entry.length;i++) ny[i] = entry[i]; entry = ny; public void insert(string k, String v){ int i = findindex(k); if(i==storl){ if(storl==entry.length) dubblera(); storl++; entry[i]=new BilInfo(k,v); Såhär fungerar tex. ArrayList 21 22 Sökning public String find(string key){ int i = findindex(key); if(i<storl) return entry[i].getinfo(); else return null; Tvådimensionella fält Ett fält kan ha två (eller fler) index. En matris med 10 rader och 15 kolumner: double[][] M = new double[10][15]; Vad gör man vid sökning om det inte finns något par med den givna nyckeln? M är ett fält av rader, som var och en är ett fält av double. Att genomlöpa en matris: for(int i=0; i<m.length;i++) for(int j=0;j<m[i].length;j++) M[i][j] = Math.random(); 23 24
Klassen Arrays I klassen java.util.arrays finns metoder man kan använda i samband med fält (tex. sökning och sortering). Överlastning (eng. overloading) Man kan ha flera metoder med samma namn om de har olika parameterlistor. Det kallas överlastning. Varför finns det nio metoder fill i Arrays med två parametrar och nio metoder med fyra? Hur skiljer sig koden åt mellan dessa nio? 25 26