Kein Folientitel - Institut für Geodäsie und Geoinformation der

Werbung
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
Herunterladen