Föreläsning 12
LISTOR I JAVA: KLASSEN ARRAYLIST
Saker du ska kunna
✓ Ta bort element från en vektor
– Både sorterad och osorterad
✓ Söka upp element i en vektor
– Linjärsökning räcker (jag har även visat binärsökning)
✓ Registrering
– (dvs. att använda en vektor för att räkna förekomster av olika slag)
✓ Sortering
– Jag har visat urvalssortering och bubbelsortering
★ Sätta in element i ordnad följd
Vektorer med objekt
Point[] vertices = new Point[3];
vertices[0] = new Point(10,10);
vertices[1] = new Point(50,10);
vertices[2] = new Point(30,40);
[0]
vertices
[1] [2]
x 30 y 40 x 50
y 10 x 10
y 10
Exempel: hantera alla punkterna
Vektorn vertices innehåller tre punkter, som utgör hörnen i en triangel. För att flytta punkterna i vektorn:
for (int i = 0; i < vertices.length; i++) { vertices[i].move(10, 20);
}
Rita triangeln:
SimpleWindow w = new SimpleWindow(600, 600, "Triangle");
w.moveTo(vertices[0].getX(), vertices[0].getY());
for (int i = 1; i < vertices.length; i++) {
w.lineTo(vertices[i].getX(), vertices[i].getY());
}
w.lineTo(vertices[0].getX(), vertices[0].getY());
Vektor för att representera en polygon
Antag att vi vill hantera polygoner med ett godtyckligt antal hörnpunkter. Då får vi gissa hur stor vektor vi behöver för punkterna:
Det behövs också en variabel som håller reda på hur många punkter vi satt in i vektorn:
null null null
0 1 2 3 4 5 6 7
n 4
vertices null
x y
50 50
x y
70 300
x y
350 350
x y
320 200
Vektorernas begränsningar
På föreläsning 9 valde vi ett maximalt antal punkter i polygonen.
Hur väljer man ett sådant värde?
• Om man gör vektorn för liten från början kan inte alla polygoner representeras (t ex en 40-hörning).
• Om man gör vektorn stor från början (säg, 1000 element) blir många element oanvända (t ex 997 st för en triangel). Då slösar vi med minne.
Ibland är det inte praktiskt möjligt att
ange ett maximalt antal element på förhand!
Exempel: klassen Polygon
Se veckans filmer (Listor, del 1–2)
Vektorernas begränsningar (forts.)
Vi kunde här utöka metoden addVertex så att en ny, större vektor skapas vid behov...
• ...men det blir en del att skriva.
• Måste göras igen om vi vill ha en annan, dynamiskt växande, lista. (T.ex. en lista av Turtle, eller heltal.)
Det vore smidigt med en datastruktur...
... som inte kräver att vi känner antalet element från början ... där vi enkelt kan lägga in eller ta bort element
... som kan hantera element av olika slag (precis som vektorer)
ArrayList
ArrayList:
• är en standardklass i Java (paketet java.util).
• innehåller alltid objektreferenser (inte int, double, ... ).
• har en typparameter som anger elementens typ.
• lagrar internt sina element i en vektor.
• utökar vektorns storlek vid behov.
• har färdiga metoder för att sätta in och ta bort element.
Viktiga operationer på ArrayList (urval)
/** Skapar en ny lista */
ArrayList<E>();
/** Tar reda på elementet på plats pos */
E get(int pos);
/** Lägger in objektet obj sist */
void add(E obj);
/** Lägger in obj på plats pos; efterföljande flyttas */
void add(int pos, E obj);
/** Tar bort elementet på plats pos och returnerar det */
E remove(int pos);
/** Tar reda på antalet element i listan */
int size();
ArrayList<E>
ArrayList är en generisk klass
ArrayList är en generisk klass och kan innehålla objekt av godtycklig typ. E är en typparameter till klassen. (Mer om
detta i EDAA01 Programmeringsteknik – fördjupningskurs.)
-> Ersätt E med typen på de objekt som lagras i listan.
Exempel där vi skapar en lista av Point-objekt och sätter in tre sådana 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));
Polygon med ArrayList
Vi kan använda ArrayList för att implementera Polygon på ett rättframt sätt.
Se veckans filmer (Listor, del 3)
Att traversera listor
(dvs göra något med listans alla element)
Anta att vi vill gå igenom en lista (t.ex. för att göra något med alla element). Då kan vi använda for på två sätt:
• Som tidigare, med hjälp av ArrayLists metoder för att få ut element och storlek, samt en vanlig for-sats.
• for-each-loopen ("the enhanced for loop”), som är särskilt anpassad för datastrukturer som ArrayList.
Skriv ut alla element: med "vanlig" for-loop
for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i));
}
Traversera med en fräsigare for-sats (kallas ibland ”for-each”)
Antag att vi har följande lista:
ArrayList<String> words = new ArrayList<String>();
Då kan vi skriva ut alla element i listan så här:
for (String s : words) { // (1) System.out.println(s);
}
For-satsen (1) ovan kan läsas som
”för varje sträng s i listan words, gör följande”
(Sådana for-satser kan även användas för vektorer, men då tas ingen hänsyn till hur många vektorelement vi verkligen använder (jämför attributet n i Polygon-exemplet). Därför används sådana for-satser mer sällan med vektorer.)
Polygon med ArrayList
Vi kan använda for-each för att gå igenom elementen i vår Polygon på ett enkelt sätt.