Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Gerhard Gröger Einführung in die Programmierung mit Java 10. Vorlesung WS 2002/2003 Übersicht • Besprechung der Hausaufgabe • Zugriffsspezifikationen (public, private,...) • Polygon: umfangreicheres Beispiel • Allgemeine Listen/Suchstrukturen G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 2 Hausaufgabe • Schreibt ein Programm, das die Reihenfolge der Elemente in einer beliebigen LinkedList umdreht und das Ergebnis in einer neuen LinkedList speichert. Testet das Programm mit geeigneten Elementen. G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 3 Lösung: import java.util.*; ..... LinkedList ll = new LinkedList(); // Liste mit Werten füllen: ll.add(new Person()); ll.add(new Professor()); //Neue Liste für umgekehrte Reihenfolge LinkedList lNeu = new LinkedList(); //Liste Durchlaufen und andere füllen: Iterator it = ll.iterator(); while(it.hasNext()) { Object o = it.next(); lNeu.addFirst(o); } G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 4 Zugriffsspezifikationen I • Zugriffsspezifikation regeln welche Klassen, Attribute und Methoden wo verwendet werden können. • Schlüsselwörter public, protected, private • wird keine Zugriffsspezifikation angegeben, gilt der default-Modus friendly • Differenziert für Klassen, Methoden, und Attribute • Wichtiges Konzept der Objektorientierung: Geheimnisprinzip: Verbergen von Details der Implementierung, Zugriff nur über klar definierte Schnittstellen G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 5 Zugriffsspezifikationen II • public: Zugriff von allen Klassen • friendly oder keine Spezifikation: Zugriff von Klassen im selben Paket, Zugriff nicht von Unterklassen in anderen Paketen geheimer • protected: Zugriff von Klassen im selben Paket, auch Zugriff von Unterklassen in anderen Paketen • private: Zugriff nur innerhalb derselben Klasse G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 6 Beispiel: Klasse Punkt public class Punkt{ private double xKoordinate; //Attribut private double yKoordinate; //Attribut public Punkt(){ xKoordinate = 0.0; yKoordinate = 0.0;} public Punkt( double x, double y ){ xKoordinate = x; yKoordinate = y;} public double x_Koordinate() {return xKoordinate;} public double y_Koordinate() {return yKoordinate;} public boolean equals(Punkt p){ if( p.xKoordinate == xKoordinate & p.yKoordinate == yKoordinate) return true; else return false;} public double abstand(Punkt p){ double a = Math.sqrt(Math.pow(xKoordinate - p.xKoordinate,2.0) + Math.pow(yKoordinate - p.yKoordinate,2.0)); return a;}} G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 7 Umfangreicheres Beispiel: Polygone p1 p2 p5 p3 p4 G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 8 Umfangreicheres Beispiel: Polygone • • • • Anwendung von Listen Anwendung von Zugriffsspezifikationen Kapselung Funktionalität von Polygonen: – Hinzufügen eines Punkts – Berechnung des Umrings – Berechnung des Flächeninhalts G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 9 Polygon: UML-Diagramm Polygon Punkt 1 hat_im_Umring 3..* {ordered} -x: double -y: double G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 10 Klasse "Polygon": Attribute und Konstruktoren public class Polygon{ public LinkedList punktliste; public Polygon(Punkt p1, Punkt p2, Punkt p3) { punktliste = new LinkedList(); punktliste.add(p1); punktliste.add(p2); punktliste.add(p3); } public Polygon(double [] x_Koord, double [] y_Koord) { punktliste = new LinkedList(); for(int i = 0 ; i < x_Koord.length; i = i+1) { Punkt p = new Punkt(x_Koord[i],y_Koord[i]); punktliste.add(p); } }} G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 11 Klasse "Polygon": Benutzung //von Außen: .... Punkt p1 = new Punkt(1,1); Punkt p2 = new Punkt(1,2); Punkt p3 = new Punkt(2,1); Polygon poly1 = new Polygon(p1, p2, p3); double [] xArray = {1,1,3,2}; double [] yArray = {1,2,3,1}; Polygon poly2 = new Polygon(xArray, yArray); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 12 Berechnung des Umfangs: Idee p1 p5.abstand(p1) p1.abstand(p2) p2 p2.abstand(p3) p5 p4.abstand(p5) p4 p3 p3.abstand(p4) G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 13 Übungsaufgabe Schreibt ein Programm (in einer "main"), das den Umfang eines Polygons berechnet. Hinweise: • Klasse Polygon: public class Polygon{ public LinkedList punktliste; ...} • nutzt die Methode "abstand" von "Punkt" • Eine LinkedList kann mehrere Iteratoren haben G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 14 Berechnung des Umfangs public static void main(String args[]) { Polygon poly = new Polygon(new Punkt(1,1), new Punkt(1,2), new Punkt(2,1)); double umfang = 0; Iterator ersterIt = poly.punktliste.iterator(); Iterator zweiterIt = poly.punktliste.iterator(); zweiterIt.next(); Punkt ersterPunkt; Punkt zweiterPunkt; while(zweiterIt.hasNext()) { ersterPunkt = (Punkt) ersterIt.next(); zweiterPunkt = (Punkt) zweiterIt.next(); umfang = umfang + ersterPunkt.abstand(zweiterPunkt); } ersterPunkt = (Punkt) poly.punktliste.getLast(); zweiterPunkt = (Punkt) poly.punktliste.getFirst(); umfang = umfang + ersterPunkt.abstand(zweiterPunkt); System.out.println(umfang); } G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 15 Umfang: Anmerkungen • Berechnung des Umfangs (Fläche,..) ist einfacher, wenn erster Punkt in Liste am Ende wiederholt wird • Dann ist aber Einfügen von Punkten (am Ende oder Anfang) schwieriger (Konsistenz, erster == letzter) • Wiederholung des ersten Punkts am Ende ist Implementierungsdetail (wie Frage Array oder Liste) • verbergen dieser Details vor Nutzer des Polygons – – – – Atttribut punktliste nicht public Umfang als Methode klar definierte, nutzerfreundliche Schnittstelle zu Polygon Kapselung G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 16 Klasse "Polygon": Attribute und Konstruktoren public class Polygon{ protected LinkedList punktliste; public Polygon(Punkt p1, Punkt p2, Punkt p3){...} public Polygon(double [] x_Koord, double [] y_Koord) {...} public double umfang() { double umfang = 0; Iterator ersterIt = punktliste.iterator(); Iterator zweiterIt = punktliste.iterator(); zweiterIt.next(); Punkt ersterPt, zweiterPt; while(zweiterIt.hasNext()) { ersterPt = (Punkt) ersterIt.next(); zweiterPt = (Punkt) zweiterIt.next(); umfang = umfang + ersterPt.abstand(zweiterPt); } ersterPt = (Punkt) punktliste.getLast(); zweiterPt = (Punkt) punktliste.getFirst(); umfang = umfang + ersterPt.abstand(zweiterPt); return umfang;} } G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 17 Listen und Mengen: vordefinierte Klassen Einfache Container-Datenstrukturen Assoziative Datenstrukturen AbstractCollection AbstractMap keine Duplikate Set LinkedList ArrayList TreeSet sortiert Map HashSet TreeMap HashMap sortiert G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 18 Laufzeiten / Komplexität Klasse Einfügen/ Löschen Suchen Suchen mit Key LinkedList/ ArrayList const. O(n) TreeSet O(log n) O(log n) HashSet const. const. (mittel) TreeMap O(log n) O(log n) HashMap const. const.(mittel) G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 19 HashMaps • Speichern Objekte (Klasse Object) in Struktur • Zuordnung eines (Such-)Schlüssel zu Objekt (Key-Value-Pair) • effizientes Suchen über Schlüssel • Methoden: – – – – put(Object Key, Object value) Object get(Object Key) void clear() int size() //Einfügen //Suchen • Weitere Methoden: JavaDoc G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 20 Hausaufgabe Schreibt eine Methode der Klasse Polygon, die den Flächeninhalt eines Polygons berechnet. Hinweise: • Orientiert euch an der Methode "Umfang" • Formel zur Berechnung des Flächeninhalts (Gaussche Flächenformel) in Diskreter Mathe, Vorlesung 2: 5 F= S 1 (xk - xk+1)(yk + 2 k = 1yk+1) G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 21