-Algoritmer och DatastrukturerListor & Generics ”Ording och reda” på datastrukturer i java med hjälp av olika interface En datastruktur är: data (representerad på olika sätt) Metoder Finns i java.util http://java.sun.com/j2se/1.5.0/ docs/api/ Collection- generell samling data List- ordnad samling av data Set- ordnad samling av data som får inte innehålla dubbletter Map- Samling av data i par ( objekt+ nyckel) Queue, - samling data som tillåter access efter en bestämd ordning För utveckling av verksamhet, produkter och livskvalitet. För utveckling av verksamhet, produkter och livskvalitet. Interface Collection Interface List • Basen är ett interface Collection som representerar en samling element utan något vetskap om hur elementen är positionerade. Collection interfacen innehåller följande metoder: boolean isEmpty (); boolean add (E x); boolean contains (Object x); boolean remove (Object x); void clear (); int size (); Iterator iterator (); …………………… För utveckling av verksamhet, produkter och livskvalitet. Listor är en ordnad samling (”rad”) av object public interface List extends Collection{ void add (int idx, Object element); boolean add (Object element); Object get (int idx); Object set (int idx, Object element); Iterator iterator (); ... ... } För utveckling av verksamhet, produkter och livskvalitet. 1 Queue List-klasser i java En ordnad samling av objekt Man kan bara komma åt första objekten i kö Man kan lägga till bara sist i kö • Det finns två konkreta generiska klasser i Javas API för listhantering. Båda implementerar alltså interfacet List ArrayList som implementerats med array LinkedList, som använder länkad struktur. Enskilda ”Nod” av data som länkas med varandra. ……………………………………… void enqueue ( Object e); Object dequeue (); Head För utveckling av verksamhet, produkter och livskvalitet. För utveckling av verksamhet, produkter och livskvalitet. En ”SimpleDataStructure” Ett program public class SimpleDataStructure { // data hålls i en array private int theSize; private Object [ ] theItems; // ta bort objekt om det hittas, inte helt bra public boolean remove ( Object obj) { int idx=-1; boolean found =false; for(int i=0;i<theItems.length; i++) // konstruerare public SimpleDataStructure() { theItems=new Object[10]; theSize=0; } // inte så bra public void add ( Object obj) { theItems [thesize]=obj; theSize++; } if( obj.equals(theItems[i]) ) { idx=i; found=true; break; } for( int i = idx; i < theSize - 1; i++ ) theItems[ i ] = theItems[ i + 1 ]; theSize--; return found; } För utveckling av verksamhet, produkter och livskvalitet. public class Program { ...main()....{ SimpleDataStructure ladok =new SimpleDataStructure (); ladok.add( new Student() ); ladok.add( new Student()); .......................................... ( av misstag efter 1000 rader kod) ladok.add( new Donkey()); } } För utveckling av verksamhet, produkter och livskvalitet. 2 En ”SimpleDataStructure” generic Generiska klasser i Java 5.0 public class SimpleDataStructure <AnyType> implements Collection <AnyType> { private int theSize; private AnyType [ ] theItems; • Typparametrar anges inom tecknen < och > i klassrubriken: public class ArrayList<E> { ... } public void add ( AnyType obj) { theItems[thesize++]= obj; } public class Program { ...main()....{ SimpleDataStructure <Student> ladok= new SimpleDataStructure <Student> (); • Typparametern kan användas i klassen för att t ex deklarera attribut, parametrar och returtyper för metoder } public class ArrayList <E> { private E [] elements; public boolean add(E x) { ... } // lägg in x sist public E get(int i) { ... } //hämta element på plats i ... } • Vi skapar instanser genom att ge parametern E ett ”verkligt datatyp” ArrayList < Student> iList = new ArrayList < Student> (); I iList kan endast Student -objekt läggas in För utveckling av verksamhet, produkter och livskvalitet. För utveckling av verksamhet, produkter och livskvalitet. Interface Comparable som ”generic” En klass som implementear en ”generic” interface, enkel fall public boolean remove( AnyType obj){ // idx- hitta index of objekt obj ........ for( int i = idx; i < size( ) - 1; i++ ) theItems[ i ] = theItems[ i + 1 ] theSize--; return found; } • ladok.add( new Student()); ladok.add( new Student()); ........................................... ladok.add( new Donkey()); // compile error }} I java biblioteket finns interfacen Comparable som används för att definiera objekt som kan jämföras och rangordnas public interface Comparable<AnyType> { public int compareTo( AnyType other); } För utveckling av verksamhet, produkter och livskvalitet. class Ball implements Comparable <Ball> { private int radius; public Ball ( int value) { radie=value; } public void move (){…..} AnyType ersäts med Ball public int compareTo( Ball other) { if (radius>other.radius) return 1; else if (radius<other.radius) return -1; else return 0 } För utveckling av verksamhet, produkter och livskvalitet. 3 En klass som implementear en ”generic” interface, Svår fall AnyType ersäts med Person class Person implements Comparable <Person> { private String name; private int age; Interface Comparator som alternativ class AgeComparator implements Comparator<Person>{ public int compare (Person emp1, Person emp2) { ………………………………………………. public int compareTo( Person other) { if( name.compareTo(other.getName())==0) /jämför namn { if (adress .......) // jämför adress class NameComparator implements Comparator<Person>{ public int compare(Person emp1, Person emp2){ String emp1Name = emp1.getName(); String emp2Name = emp2.getName(); int emp1Age = emp1.getAge(); int emp2Age = emp2.getAge(); } } if(emp1Age > emp2Age) return 1; else if(emp1Age < emp2Age) return -1; else return 0; return emp1Name.compareTo(emp2Name) } } } } } För utveckling av verksamhet, produkter och livskvalitet. För utveckling av verksamhet, produkter och livskvalitet. Hur används ”Comparator-s” ? En ”generic” algoritm- findMax metoden Program exempel TestComparator public static <AnyType extends Comparable<? super AnyType>> AnyType findMax ( AnyType [ ] a ) { int maxIndex = 0; for( int i = 1; i < a.length; i++ ) if( a[ i ].compareTo ( a[ maxIndex ] ) > 0 ) maxIndex = i; return a[ maxIndex ]; } För utveckling av verksamhet, produkter och livskvalitet. För utveckling av verksamhet, produkter och livskvalitet. 4 Interface Iterator , Iterable * Iterator interface for Collections. */ public interface Iterator< AnyType> { * Tests if there are more items in the collection. * @return true if there are more items in the collection. boolean hasNext ( ); * Obtains the next item in the collection. * @return the next (as yet unseen) item in the collection. AnyType next( ); } * Remove the last item returned by next. * Can only be called once after next. void remove( ); En iterable datastruktur import java.util.*; public class MyArrayList<AnyType> implements Iterable<AnyType> { private AnyType [] list ; private int count ; ………………………………………………. public Iterator <AnyType> iterator() { return new ArrayListIterator (list, count); } } För utveckling av verksamhet, produkter och livskvalitet. För utveckling av verksamhet, produkter och livskvalitet. En ArrayListIterator Iterator fortsättning import java.util.*; class ArrayListIterator <T> implements Iterator<T> { private int count; private int current; private T[] items; public boolean hasNext() { return current<count; // konstruerare public ArrayListIterator(T[ ] elements, int size) { items=elements; count=size; current=0; } } public T next () { current++; return items [current-1]; } public void remove() { // metoden måste vara med men lämna den tom } } För utveckling av verksamhet, produkter och livskvalitet. För utveckling av verksamhet, produkter och livskvalitet. 5 List-klasser i java Test • Det finns två konkreta generiska klasser i Javas API för listhantering. Båda implementerar alltså interfacet List ArrayList som implementerats med array LinkedList, som använder länkad struktur i implementationen “Testing Man bör bara använda ArrayList om alla insättningar görs sist i listan. Insättningar i andra positioner samt remove orsakar flyttningar av element. “Testing can show the presence of bugs, but not the absence” (Dijkstra) is the process of executing a program with the intent of finding errors” (Myers) https://supportweb.cs.bham.ac.uk/docs/tutorials/docsystem/build/tutorials/juni t/junit.html För utveckling av verksamhet, produkter och livskvalitet. Varför är vi inte bättre på TEST? • Testning är onödigt och icke produktiv • Om utvecklingen sker korrekt kommer alltid kravet att vara uppfyllt • Utveklingstiden för mjukvara är svårbedömd. Oftast brist om tid. • Leveransen i tid är viktigare än felfri mjukvara • Test gör slumpmässigt och oplanerat För utveckling av verksamhet, produkter och livskvalitet. För utveckling av verksamhet, produkter och livskvalitet. Test begrepp -Olika typer av test, som utförs på olika nivå i mjukvaruutveckling. - De klassificeras i en av kategorin ”white-box” eller black-box Enhets test Unittest Integrations test Funktions test Funktionstestet Modultest testar systemet som en helhet utifrån de funktionella krav System test Acceptans test Systemtester testar systemet fungerar enligt de övergripande specifikationer Systemtest men utförs av slutanvänd. För utveckling av verksamhet, produkter och livskvalitet. 6 Vad skall vi testa? import org.junit.Assert; import org.junit.Before; import org.junit.Test; public class SimpleDataStructureTest { /** Fixture initialization (common initialization * for all tests). **/ @Before public void setUp() { } /** A test that always fails. **/ @Test public void defaultTest() { Assert.assertEquals ("Default test added by jGRASP. Delete " + "this test once you have added your own.” , 0, 1); } } För utveckling av verksamhet, produkter och livskvalitet. Statement Description fail(String) Let the method fail. Might be used to check that a certain part of the code is not reached. Or to have failing test before the test code is implemented. assertTrue(true) / assertTrue(false) Will always be true / false. Can be used to predefine a test result, if the test is not yet implemented. assertTrue([message], boolean condition) Checks that the boolean condition is true. assertsEquals([String message], expected, actual) Tests that two values are the same. Note: for arrays the reference is checked not the content of the arrays. assertsEquals([String message], expected, actual, tolerance) Test that float or double values match. The tolerance is the number of decimals which must be the same. assertNull([message], object) Checks that the object is null. assertNotNull([message], object) Checks that the object is not null. assertSame([String], expected, actual) Checks that both variables refer to the same object. assertNotSame([String], expected, actual) Checks that both variables refer to different ** Testar metoden add // - add av 1 objekt blir size 1 // - add när dubblering sker, testa size // - add och contains // - add mot get // - add och isEmpty // - add och indexof ** Testar remove // - remove mot size() // -remove mot contains // -remove när isEmpty // - remove när objektet inte finns * ** Testar get och IndexOutofBounds // - contains mot För utveckling av verksamhet, produkter och livskvalitet. Annotation/ speciella komentarer • • • • För utveckling av verksamhet, produkter och livskvalitet. @Test public void method() The annotation @Test identifies that a method is a test method. @Before public void method() Will execute the method before each test. This method can prepare the test environment (e.g. read input data, initialize the class). @After public void method() Will execute the method after each test. This method can cleanup the test environment (e.g. delete temporary data, restore defaults). @BeforeClass public void method() Will execute the method once, before the start of all tests. This can be used to perform time intensive activities, for example to connect to a database. För utveckling av verksamhet, produkter och livskvalitet. 7 Annotations • @Test (expected = Exception.class) Fails, if the method does not throw the named exception. • @Test(timeout=100) Fails, if the method takes longer than 100 milliseconds För utveckling av verksamhet, produkter och livskvalitet. Använd inte Unit Test om • Metoden/ modulen kommunicerar med lokal databas • Kommunicerar över nätverk • Använder filsystem För utveckling av verksamhet, produkter och livskvalitet. 8