Exempel for (int antal=; antal < 75; antal++) System.out.println (antal); Arrayer for (int num=5; num <= total; num = num*) sum = sum + num; System.out.println (sum); 8 8 Ett problem Hur sparas data T ex när man vill spara resultaten av en tävling Exempel med deltagare: public class Competition private int result; private int result; private int result; Håller detta för, eller ett okänt antal? 8 Lösningen Deklarerar utrymme för många variabler i en enda deklaration! Array (fält) En är en sekvens (ordnad lista) av värden Varje värde har ett numeriskt index N element indexeras med till N- 5 6 7 8 9 Exempel: results 79 87 9 8 67 98 87 8 7 9 8 Arrayer Alla värden har samma datatyp Får vara primitiva datatyper eller klasstyper I Java behandlas er som objekt! Instansieras med new! Namnet på fältet är en referens! Index är av datatyp int OBS! Vid instansiering av ett fält med objekt instansieras ej objekten. Det skapas bara utrymmet för rätt antal referenser. 85 Arrayer och hakparanteser Deklaration typename[] Name; Instansiering Name = new typename[numberofelements]; numberofelements godtyckligt uttryck av typ int Åtkomst av element Name[index] // index >= && index < numberofelements indexerar man sig utanför godkända index inträffar ett undantag (programmet avslutas om vi inte aktivt undviker detta) 86
Exempel int[] results; results = new int[]; //..9 int i = ; char[] koder = new char[i]; Triangle triangles[]=new Triangle[i+]; Arrayer som datatyp Arrayer är en datatyp För varje datatyp finns en motsvarande datatyp Typen är typename[] Storleken ingår inte i datatypen! Grundtypen bestämmer kompatibiliteten! Även fält referenser är polymorfa 87 88 Fler exempel int[] results = new int[]; int[] results = new int[]; Primitiva datatyper Instansiera er Klasstyper int[] ; Triangle[] tarray; tarray results = results; results = results; OK, då samma datatyp = new int[]; tarray = new Triangle[]; tarray [] = ; tarray[] = new Triangle(); tarray 89 9 Instansiera er Glöm inte att instansiera en före användningen int[] results; results[] = 99;! NullPointerException ett undantag, dessa kan bevakas och fångas upp för att hanteras, vilket vi kommer titta på på en senare föreläsning 9 Initialisera med listor Hela fältet kan initialiseras vid deklarationen int[] enheter = 7,, 89, 9, 5, 69, 97; char[] kursniva = 'A', 'B', 'C', 'D'; Längden bestäms av antalet element Endast vid deklarationen Observera: new används inte Ingen explicit storlek 9
Väl skapat är ens storlek fix Index måste referera till existerande element! Index måste vara i intervallet storlek- Index kontrolleras dynamiskt (under körning) int[] =,,,, 5; int i; i = [5]; Indexkontroll! ArrayIndexOutOfBoundsException: 5 9 5 Arrayers storlek Varje Array objekt har ett publikt attribut length som anger antalet element, inte högsta index OBS! Leder ofta till off-by-one fel Används ofta i loopar Exempel: int[] = ; for (int i = ; i <=.length; i++) [i] ; for (int i = ; i <.length; i++) [i] ; Off-by-one fel, eftersom index löper från till.length- 9 Objekt som element Elementen i en kan vara objektreferenser Circle[] cirkel = new Circle[5];! Fem referenser till objekt av typen Circle OBS! Inga objekt har skapats (referensen är ) cirkel[] = new Circle(); Objekten måste skapas separat t.ex. m.h.a. loop for (int i=;i < cirkel.length;i++) cirkel[i] = new Circle(); cirkel[i].changesize((i+)*); 95 Arrayer som parametrar Arrayreferensen överförs ( kopieras ) och den formella och aktuella parametern blir alias Ändringar påverkar båda Eftersom storleken inte är del av datatypen får den aktuella parametern ha godtycklig längd int[] =,,,, 5;.aMethod (); public void amethod (int[] numbers) numbers[] = 99; [] = ; numbers 96 99 5 Arrayer som parametrar: Object findobjectinarray(object o, Object[] OfObjects) int i; // local variable for (i = ; i < OfObjects.length; i++) if (OfObjects[i] == o) // alias return o; return ; public class GeoFigurer Exempel... Circle[] cirkel = new Circle[5]; String[] farger = "red", "yellow", "blue", "green", "magenta", "black"; public GeoFigurer() for (int i=;i < cirkel.length; i++) cirkel[i] = new Circle(); cirkel[i].changesize((i+)*); cirkel[i].movehorizontal((i+)*5); for (int i=cirkel.length-; i >= ; i--) cirkel[i].changecolor(farger[i]); // GeoFigurer 97 98
Flerdimensionella er Arrayer kan ha flera dimensioner En-dimensionella er motsvarar listor Två-dimensionella er motsvarar tabeller eller matriser med rader & kolumner Array av av av...! Varje dimension har ett eget index! Varje dimension har sin egen length Kan initialiseras med listor 99 Ännu fler exempel int[][] matrix = new int[][]; int[][] matrix =,,,,,,,,, int[][][] matrix = new int[][][]; matrix[].length == ; matrix[].length == ; matrix[][] = matrix[][]; matrix[] = matrix[]; matrix[] = matrix; Triangle[][][][][] fivedimensional; Kopiera er Arrayvariabler är referenser! Tilldelning gör ingen kopia på elementen i fältet int[] =,,,, 5; int[] = new int[5]; = ; 5 Kopiera er System.copy gör kopia element för element Vid flerdimensionella er måste den anropas flera gånger Gör lämpligtvis i en (nästad) loop public static void copy ( Object source, int srcindex, Object dest, int destindex, int size) throws ArrayIndexOutOfBoundsException, ArrayStoreException Vi kan självklart göra det manuellt också Klassen ArrayList (java.util) Ett objekt av klassen ArrayList liknar en Men Har dynamisk längd, dvs längden utökas efter behov Lagrar bara referenser till objekt av typen Object Man får bara Object tillbaka Inte samma syntax för indexering Implementeras med er ArrayList ArrayList ArrayList ( ) + add(object obj) + add (int index, Object obj) + set (int index, Object obj) + remove (int index) + Object get (int index) + boolean contains (Object obj) + boolean isempty ( ) + int indexof (Object obj) + int size ( ) + clear ( )...
Effektiviteten av ArrayList När ett element sätts in flyttas (kopieras) alla efterföljande element en position åt höger 5 6 7 8 9 79 87 9 8 67 98 87 8 7 9... sätt in på index När ett element tas bort flyttas (kopieras) alla efterföljande element en position åt vänster 5 6 7 8 9 79 87 9 8 67 98 87 8 7 9...! Ej effektivt 5 Generics I tidigare versioner av Java kan man göra generella klasser (tex ArrayList) med hjälp av Object. Fördel är att man behöver skriva koden till listan en enda gång och sen använda den oavsett vad som ska lagras. Nackdel är att man i en och samma lista kan lagra olika objekt huller om buller. (Först en bok, sen ett bibliotek följt av ett hus etc) En annan nackdel är att man behöver göra många typecasts i kod som använder sig av en klass som utnyttjar Object. Mha generics så kan man istället specificera (vid konstruktion av objektet) vad som ska lagras 6 Autoboxing Automatisk konvertering mellan primitiva typer och wrapperklasserna Integer, Float, Boolean etc Ex: Integer i = new Integer(9); Integer j = new Integer(); Integer k = i + j; //Typfel i java. I java sedan version 5 Kod kommer att infogas för att göra konverteringen så det kommer inte gå snabbare än om man gör det manuellt, men koden blir mindre plottrig Utan generics och autoboxing import java.util.*; public class ArrayListTest public static void main(string[] args) ArrayList mylist = new ArrayList(); mylist.add(new Integer()); mylist.add("hejsan svejsan"); int testint=((integer)mylist.get()). intvalue(); System.out.println(testInt); 8 Johan Eliasson Med generics och autoboxing import java.util.*; public class ArrayListTest public static void main(string[] args) ArrayList<Integer> mylist = new ArrayList<Integer>(); mylist.add(); mylist.add("hejsan svejsan"); // Blir kompileringsfel ovan nu!! int testint = mylist.get(); // OBS! (Integer) och.intvalue borta System.out.println(testInt); 9 Iteratorer Kan användas för att gå igenom samlingar av värden tex i Vector, ArrayList m.fl. Vector<Integer> v=new Vector<Integer>(); for(int i =;i<;i++) v.add(new Integer(i)); Iterator<Integer> it = v.iterator(); while(it.hasnext()) it.next()
For-each Ny variant på for-loopen. Tillkom i Java.5 (5) ArrayList<Integer> v=new ArrayList<Integer>(); for(int i =;i<;i++) v.add(new Integer(i)); for(integer value:v) value Funkar för er och alla klasser som implementerar interfacet Iterable