340 likes | 449 Views
Begreber og Redskaber 11. BRP. Plan for idag. Lidt afrunding: Collections Framework i Java Noget om oversættere og sprog Evaluering Sidste gang øvelser før jul. Collections i Java. En ramme til at arbejde med søgning og sortering i datastrukturer. Krav: Objekter skal kunne sammenlignes.
E N D
Plan for idag • Lidt afrunding: • Collections Framework i Java • Noget om oversættere og sprog • Evaluering • Sidste gang øvelser før jul.
Collections i Java • En ramme til at arbejde med søgning og sortering i datastrukturer. • Krav: Objekter skal kunne sammenlignes. • Datastrukturer: Lister, mængder, maps • Operationer: søgning, sortering, mængde- operationer, min, max, gennemløb,..
Sammenligning interface Comparable public int compareTo(Object o) <0: mindre =0: ens >0 større f.eks class Person implements Comparable{ String navn; public int compareTo(Object o){ return navn.compareTo(((Person) o).navn); } Person(String navn){this.navn=navn;} public String toString(){return navn;} }
Datastrukturer • Collection • List (indicering, rækkefølge) • Mængde (Set) (unikke elementer) • (alternativ til Vector) • Map • Nøgle-værdi par • (alternativ til HashTable) • Collections, Arrays • Statiske standard metoder
List List lst = new ArrayList(); // eller List lst = new LinkedList(); lst.add("D");lst.add("B");lst.add("A");lst.add("C"); System.out.println(lst); Collections.sort(lst); System.out.println(lst); Collections.reverse(lst); System.out.println(lst); Collections.shuffle(lst); System.out.println(lst); // [D, B, A, C] // [A, B, C, D] // [D, C, B, A] // [B, A, D, C]
Interface • List,Set, Map er interfaces • Kan implementeres på mange måder med forskellig effektivitet afhængig af brug – tabeller, hægtede lister,rød-sorte træer, hashing, mm. • Anvendelsen uafhængig af implementation og algoritmer.
Tabel som liste Person[] ps ={ new Person("Ham"), new Person("Hende"), new Person("Den anden"), new Person("En anden") }; List l = Arrays.asList(ps); p(l); Collections.sort(l); p(l); Collections.reverse(l); p(l); Collections.shuffle(l); p(l);
Uddata Tabel: [Ham, Hende, Den anden, En anden] Sort: [Den anden, En anden, Ham, Hende] Reverse: [Hende, Ham, En anden, Den anden] Shuffle: [En anden, Ham, Hende, Den anden]
Operationer på lister public interface List extends Collection Object get(int index); Object set(int index, Object element); void add(int index, Object element); Object remove(int index); int indexOf(Object o); int lastIndexOf(Object o); List subList(int from, int to); Object[] toArray();
Flere operationer • Kopiering af liste new ArrayList(Collection c); new LinkedList(Collection c); f.eks. List lst = new ArrayList(l); • Liste konkatenering abstract boolean addAll(Collection c); f.eks. lst.addAll(l)
Flere sorteringer • Sorter efter andre sammenligninger: class NavnLen implements Comparator{ public int compare(Object o1,Object o2){ Person p1 = (Person) o1; Person p2 = (Person) o2; return p1.navn.length()-p2.navn.length(); }} //f.eks cpr nummer, fornavn, efternavn,.. Collections.sort(l,new NavnLen());
Mængder public interface Set { int size(); boolean isEmpty(); boolean contains(Object element); boolean add(Object element); boolean remove(Object element); Iterator iterator(); boolean containsAll(Collection c); boolean addAll(Collection c); boolean removeAll(Collection c); boolean retainAll(Collection c); void clear();
Mængdeopertioner • Nye kopier • new HashSet(Collection c) • new TreeSet(Collection c) • TreeSet er repræsenteret som en sorteret mængde • Mulighed for udtrække delmængder: headSet(toObj), tailSet(fromObj), subSet(fromObj,toObj)
Mængde operationer Set s1 = new HashSet(), s2= new HashSet(); for(int i=0;i<10;i+=2)s1.add(new Integer(i)); for(int i=0;i<10;i+=3)s2.add(new Integer(i)); System.out.println(s1+" "+s2); Set union = new HashSet(s1); union.addAll(s2); System.out.println(union); Set intersection = new HashSet(s1); intersection.retainAll(s2); System.out.println(intersection); Set difference = new HashSet(s1); difference.removeAll(s2); System.out.println(difference);
Mængde operationer //Set s1 = new HashSet(), s2= new HashSet(); [8, 6, 4, 2, 0] [9, 6, 3, 0] [9, 8, 6, 4, 3, 2, 0] [6, 0] [8, 4, 2] //Set s1 = new TreeSet(), s2= new TreeSet(); [0, 2, 4, 6, 8] [0, 3, 6, 9] [0, 2, 3, 4, 6, 8, 9] [0, 6] [2, 4, 8]
class Collections • Object max(Collection coll) • Object min(Collection coll) • copy(List dest, List src) • List nCopies(int n, Object o) • reverse(List l) • shuffle(List list) • Set singleton(Object o) • sort(List list) • sort(List list, Comparator c) • int binarySearch(List list, Object key)
Class Arrays List asList(Object[] a) int binarySearch(int[] a, int key) int binarySearch(Object[] a, Object key) fill(int[] a, int val) fill(Object[] a, Object val) sort(int[] a) sort(Object[] a) sort(Object[] a, Comparator c)
Og mere.. • Iteration gør det muligt at ændre struktur under gennemløb (modsat Enumeration) • next, hasNext, remove • asList gør at tabellen kan bruges som liste. Ændres listen så ændres tabellen også
Map: HashMap, TreeMap public interface Map { Object put(Object key, Object value); Object get(Object key); Object remove(Object key); boolean containsKey(Object key); boolean containsValue(Object value); int size(); boolean isEmpty(); // Bulk Operations void putAll(Map t); void clear(); // Collection Views public Set keySet(); public Collection values(); public Set entrySet();
Map Map mp= new TreeMap(); mp.put("Mads","Mads Rosendahl"); mp.put("Karl","Karl Børgesen"); System.out.println(mp); mp.put("Mads"+"","Rosendahl, Mads"); System.out.println(mp); System.out.println(mp.get("Karl")); System.out.println(mp.keySet()); System.out.println(mp.values()); // {Karl=Karl Børgesen, Mads=Mads Rosendahl} // {Karl=Karl Børgesen, Mads=Rosendahl, Mads} // Karl Børgesen // [Karl, Mads] // [Karl Børgesen, Rosendahl, Mads]
Køretids typekontrol i Java Typekontrol på oversættelsestidspunkt Begrebet kendes som "templates" i C++ Undgå en del polymorfi (Object) og konvertering class Stak{ private Object array ... public Object pop(){ ...} public void push(Object o){...} } Stak s; s.push(Integer(3)) Integer I = (Integer) s.pop();
Parametriske typer Mulig udvidelse til Java: Parametriske typer class Stak(Type T){ private T array ... public T pop(){ ...}; public void push(T t){...} } Stak(int) s = new Stak(int); s.push(3); int i = s.pop();
Algebraiske typer Hægter kan være "null" og det skal checkes på kørselstidspunktet abstract class Tree{} class Node extends Tree{ ...} class Branch extends Tree{Tree v; Tree h; ...} Tree t = new Branch(new Node( ),new Node( )) Tree t1 = null; Tree t2 = new Branch(t1,t1);
Algebraiske typer Mulig udvidelse til Java: Datatype Tree = Node(int)| Branch(Tree,Tree) Tree t = Branch(Node(3),Node(4)) • "null" er ikke en mulig værdi • Test: switch (t) { case Node(int i) : .. case Branch(Tree t1,Tree t2) :.. } • Kan kombineres med parametriske typer så datatypen kan parametriseres.
Analyse af programmer • De fleste "interessante" analyser af programmer er uafgørlige. Det er nødvendigt at gøre dem "konservative" (dvs. formulere dem så usikre resultater er acceptable). • Analyse af hægter: hvilke "new"-kald kan en given hægtevariabel pege på. • Kan en hægte pege på "null” ? • Uafgørligt om en hægtevariable er "null". Tree t = null; if(x^3+y^3=z^3) t = new Tree(..); p(t) /* er t == "null"? */
Konservative analyser i Java • I Java undersøges det om variable garanteret bliver initialiseret. • Det undersøges også om al kode er tilgængelig. • Begge undersøgelser er "konservative"
Optimering • "inlining" (udfoldning) af metodekald. Normalt kun muligt hvis metoderne er "final". • Flytte konstante udtryk ud af løkker. • Forenkle operationer i løkker ved brug af induktionsvariable/løkkevariable. • "hale-rekursion" hvis sidste operation i en metode er et rekursivt kald kan det erstattes med et hop til starten af metoden. • Finde konstantudtryk .. let med static final.
Simula Simula: (1968) Klasser, nedarvning, overskrivning Parameteroverførsel: navn, værdi, reference Blokstruktureret – klasser i klasser Ikke: overlæsning
C++ C++: (1986) Klasser, strukturerede typer, simple typer Pointere (adresser) til obj, strukturer, proc. Templates, operator overloading Multipel nedarvning Globale variable og metoder Både proceduralt og OO sprog
Typer af sprog • Imperative sprog Pascal, C , Cobol, Fortran • Logik Prolog • Funktionsprogrammering Miranda, ML • Objektorienterede og distribuerede Beta, C++, Smalltalk, Java • Assembler og Maskinkode
Historie - oversættere 1944 von Neumann programmer i maskinens lager 1945 Plankalkül Konrad Zuse 1946 Johniac John von Neumann 1948 Edsac Wilkes et al. 1950 Assembler samler et hovedprogram med delrutiner 1951 order codes Wilkes, Wheeler Gill 1951 ”assembler” Wilkes, Wheeler Gill 1952 A-0-compiler Grace Hopper 1954 ”compiler” Hopper, Wilkes 1954 Fortran Backus et al. 1957 Fortran I Backus et al. 1960 Algol 60 Naur et al. 1962 makroer Makro assemblere
Programmeringssprog Maskinkode Assembler Fortran Cobol 1958 1960 1962 1964 1966 1968 1970 1972 Ada Algol 60 Algol W PL/I Algol 68 Simula Pascal CPL BCPL B C C++ Modula 2
Oversætterstruktur tegnfølge leksikalsk analyse følge af ``tokens'' syntaksanalyse parsetræ oversættelse mellemkode el. assembler bytekode optimering assembler JVM maskinkode