Lektion 6: Collections, Telefonbuchbeispiel 702 / 763
Beispiel: Telefonbuch Schreiben Sie eine Klasse, die bis zu maximal 20 Namen mit dazugehörigen Telefonnummern verwalten kann Funktionen: Name + Telefonnummer hinzufügen (anhängen) Liste nach Namen sortieren Hinweis: Zum Sortieren kann Selektion Sort (siehe oben) benutzt werden, wobei die Ordnung der Strings mit compareto ermittelt werden kann... 703 / 763
Beispiel: Telefonbuch public class Person { private String name; private int phone; //Custom-Konstruktor public Person (String name, int phone) { this.name = name; this.phone = phone; //Kopierkonstruktur public Person (Person p) { this.name = p.name; this.phone = p.phone;... 704 / 763
Beispiel: Telefonbuch public class Person {... public String getname() { return name; public int getphone () { return phone;... 705 / 763
Beispiel: Telefonbuch public class Person {... public String tostring() { return name+": "+phone; 706 / 763
Beispiel: Telefonbuch public class Phonebook { private static final int MAX_PERSON = 20; private Person[] entry = new Person[MAX_PERSON]; private int length = 0; public void add (Person p) throws PhonebookFullException { if (length == MAX_PERSON) throw new PhonebookFullException();... entry[length++] = new Person(p); 707 / 763
Beispiel: Telefonbuch public class Phonebook {... public void add (Person p) throws PhonebookFullException {...siehe oben public void add (String name, int phone) throws PhonebookFullException { if (length == MAX_PERSON) throw new PhonebookFullException(); entry[length++] = new Person(name, phone);... 708 / 763
Beispiel: Telefonbuch public class Phonebook {... public void sort () { for (int i=0; i<length; i++) { //Index mit kleinster Zahl suchen int minindex = i; for (int j=i+1; j<length; j++) { if (entry[minindex].getname(). compareto(entry[j].getname())>0) { minindex = j; //Tauschen Person min = entry[minindex]; entry[minindex] = entry[i]; entry[i] = min;... 709 / 763
Beispiel: Telefonbuch public class Phonebook {... public String tostring () { String ret=""; for (int i=0; i<length; i++) { ret += entry[i] + "\n"; return ret; 710 / 763
Beispiel: Telefonbuch public class Main { public static void main (String[] args) { try { Phonebook ph = new Phonebook(); ph.add("john", 13); ph.add("christiane",19); ph.add("peter", 12); ph.add("claudia", 51); ph.add("max", 52); System.out.println(ph); ph.sort(); System.out.println(ph); catch (PhonebookFullException ex) { System.out.println("FEHLER"); 711 / 763
Beispiel: Phonebook - Ausgabe D:\eprog\Telefonbuch>java Main John: 13 Christiane: 19 Peter: 12 Claudia: 51 Max: 52 Christiane: 19 Claudia: 51 John: 13 Max: 52 Peter: 12 712 / 763
Beispiel: Phonebook - Ausgabe public class Phonebook {... public boolean hasphone (String name) {... public int getphone (String name) { for (int i = 0; i< length; i++) { if(entry[i].getname().equals(name)) { return entry[i].getphone(); return 0;... 713 / 763
Collection-Klassen (Container-Klassen) & Maps zum Speichern einer Sammlung von Objekten des gleichen Typs (Elemente) Elemente sind anonym Elemente müssen Objekte sein (müssen Referenztyp haben, keine primitiven Typen) es gibt Methoden zum Lesen von Elementen (z.b. mit Index-Parameter) und zum Hinzufügen und Löschen von Elementen. Variierende Anzahl an Elementen (Länge der Liste wird dynamisch durch Anzahl der gespeicherten Elemente bestimmt). 714 / 763
ArrayList-Klasse ArrayList<Rational> rs = new ArrayList<Rational>(); rs.add(new Rational(1,2)); rs.add(new Rational(3,4)); rs.add(new Rational(1,9)); Angabe des Elementtyps Rational num denom Rational 1 2 3 4 num denom Rational 1 9 num denom... rs ArrayList<Rational>... 715 / 763
ArrayList-Klasse ArrayList<Rational> rs = new ArrayList<Rational>(); rs.add(new Rational(1,2)); rs.add(new Rational(3,4)); rs.add(new Rational(1,9)); Angabe des Elementtyps Rational num denom Rational 1 2 3 4 num denom Rational 1 9 num denom... rs ArrayList<Rational>... 716 / 763
ArrayList-Klasse Der ArrayList-Typ für einen Elementtyp T wird bezeichnet mit ArrayList<T> Beispiel für eine Liste mit 4 Elementen (Zeichenketten): ArrayList<String> sl = new ArrayList<String>(); sl.add("wir"); sl.add(null); sl.add("lernen"); sl.add("java!"); 717 / 763
ArrayList-Klasse: Methoden add(t elem): Neues Element an die Liste anhängen set(int i, T elem): i-tes Element mit elem-objekt ersetzen. T get(int i): liefert i-tes Element als Rückgabe. T remove(int i): i-tes Element löschen (Elemente i+1 bis zum Ende der Liste rücken nach, wie bei einem Bücherstabel, aus dem ein Buch herausgenommen wird). Liefert gelöschtes Element zurück. int size() liefert die Anzahl der Elemente (Länge) der Liste Weitere Methoden: siehe http://java.sun.com/j2se/1.5.0/docs/api/java/util/arraylist.html 718 / 763
ArrayList-Klasse: Methoden import java.util.arraylist; class RationalApp { public static void main (String [] args) { ArrayList<Rational> rs = new ArrayList<Rational>(); rs.add(new Rational(1,2)); rs.add(new Rational(2,3)); for (int i = 0; i<rs.size();i++) { System.out.println(rs.get(i)); 719 / 763
ArrayList-Klasse public class Phonebook { private static final int MAX_PERSON = 20; private Person[] entry = new Person[MAX_PERSON]; private int length = 0; public void add (Person p) throws PhonebookFullException { if (length == MAX_PERSON) throw new PhonebookFullException();... entry[length++] = new Person(p); 720 / 763
ArrayList-Klasse public class Phonebook { private ArrayList<Person> entry = new ArrayList<Person>(); public void add (Person p) { entry.add(new Person(p));... 721 / 763
Beispiel: Telefonbuch public class Phonebook {... public void sort () { for (int i=0; i<length; i++) { //Index mit kleinster Zahl suchen int minindex = i; for (int j=i+1; j<length; j++) { if (entry[minindex].getname(). compareto(entry[j].getname())>0) { minindex = j; //Tauschen Person min = entry[minindex]; entry[minindex] = entry[i]; entry[i] = min;... 722 / 763
Beispiel: Telefonbuch public class Phonebook {... public void sort () { for (int i=0; i<entry.size(); i++) { //Index mit kleinster Zahl suchen int minindex = i; for (int j=i+1; j<entry.size(); j++) { if (entry.get(minindex).getname(). compareto(entry.get(j).getname())>0) { minindex = j; //Tauschen Person min = entry.get(minindex); entry.set(minindex,entry.get(i)); entry.set(i,min);... 723 / 763
ArrayList-Klasse Array ArrayList Definition String[] a; ArrayList<String> a; Erzeugen a = new String[20]; a = new ArrayList<String>(); Schreiben a[i] = "Java"; a.set(i, "Java"); Lesen String s = a[i]; String s = a.get(i); Löschen - a.remove("java"); a.remove(i); Länge der Liste - a.size(); String kann oben durch einen beliebigen Referenztyp (z.b. Person, Complex, Double...) ersetzt werden weitere Methoden siehe: http://java.sun.com/j2se/1.5.0/docs/api/java/util/arraylist.html 724 / 763
Wrapper-Klassen stehen für alle primitiven Datentypen zur Verfügung Benutzung: dort wo Referenztypen erwartet werden, z.b. zum Speichern in Collections Hüll-Objekte (Referenztyp!) um den primitiven Wert stellen zusätzliche Methoden zur Verfügung Beispiel intobj 42 Objekt Integer intobj = new Integer(42); 725 / 763
Wrapper-Klassen Beispiele: Integer iobj = new Integer(42); int i = iobj.intvalue(); //Methode liefert primitiven int-wert Double dobj = new Double(3.14); double d = dobj.doublevalue(); //liefert primitiven Wert 726 / 763
Wrapper-Klassen primitiver Typ Wrapper-Klasse int Integer double Double char Character... 727 / 763
Autoboxing Wenn ein primitiver Wert eingesetzt wird wo ein Objekt erwartet wird, wird der Wert implizit in ein Wrapperobjekt verpackt Autoboxing fügt automatisch einen Konstruktoraufruf ein Integer intobj = 42; ist zulässig und wird automatisch als Integer intobj = new Integer(42); interpretiert. 728 / 763
Autoboxing Wenn ein Wrapper-Objekt zur Verfügung steht wo ein primitiver Wert erwartet wird, wird automatisch ein Getter-Aufruf eingefügt int i = intobj; ist zulässig und wird automatisch als int i = intobj.intvalue(); interpretiert. 729 / 763
Die Klasse Stack Stack ist ebenfalls eine Collection-Klasse Speichert auch als Elemente Objekte (z.b. Complex, Rational, Integer, Double,...) Elementtyp wird wieder mit Typparameter festgelegt stellt Standard Collection-Methoden, wie add, get zur Verfügung hat aber auch Methoden push: neues Element auf den Stapel legen pop: Oberstes Element vom Stapel nehmen und zurückliefern 730 / 763
Die Klasse Stack Funktioniert nach dem Last In First Out -Prinzip (LIFO) wie ein Stapel Ein Tellerspender: nur auf den obersten Teller kann zugegriffen werden 731 / 763
Die Klasse Stack Stack<Integer> s = new Stack<Integer>(); s.push(new Integer(3)); s.push(new Integer(2)); s.push(new Integer(-5)); int op2 = s.pop().intvalue(); int op1 = s.pop().intvalue(); s.push(integer(op1 + op2)); op2 = s.pop().intvalue(); op1 = s.pop().intvalue(); s.push(integer(op1 - op2)); oben auf dem Stapel liegt jetzt: 3 (2 + 5) = 6 Berechnung mit UPN-Rechner: 3 2-5 + - 732 / 763
Die Klasse Stack Stack<Integer> s = new Stack<Integer>(); s.push(new Integer(3)); s.push(new Integer(2)); s.push(new Integer(-5)); int op2 = s.pop().intvalue(); int op1 = s.pop().intvalue(); s.push(integer(op1 + op2)); op2 = s.pop().intvalue(); op1 = s.pop().intvalue(); s.push(integer(op1 - op2)); oben auf dem Stapel liegt jetzt: 3 3 (2 + 5) = 6 Berechnung mit UPN-Rechner: 3 2-5 + - 733 / 763
Die Klasse Stack Stack<Integer> s = new Stack<Integer>(); s.push(new Integer(3)); s.push(new Integer(2)); s.push(new Integer(-5)); int op2 = s.pop().intvalue(); int op1 = s.pop().intvalue(); s.push(integer(op1 + op2)); op2 = s.pop().intvalue(); op1 = s.pop().intvalue(); s.push(integer(op1 - op2)); oben auf dem Stapel liegt jetzt: 2 3 3 (2 + 5) = 6 Berechnung mit UPN-Rechner: 3 2-5 + - 734 / 763
Die Klasse Stack Stack<Integer> s = new Stack<Integer>(); s.push(new Integer(3)); s.push(new Integer(2)); s.push(new Integer(-5)); int op2 = s.pop().intvalue(); int op1 = s.pop().intvalue(); s.push(integer(op1 + op2)); op2 = s.pop().intvalue(); op1 = s.pop().intvalue(); s.push(integer(op1 - op2)); oben auf dem Stapel liegt jetzt: -5 2 3 3 (2 + 5) = 6 Berechnung mit UPN-Rechner: 3 2-5 + - 735 / 763
Die Klasse Stack Stack<Integer> s = new Stack<Integer>(); s.push(new Integer(3)); s.push(new Integer(2)); s.push(new Integer(-5)); int op2 = s.pop().intvalue(); int op1 = s.pop().intvalue(); s.push(integer(op1 + op2)); op2 = s.pop().intvalue(); op1 = s.pop().intvalue(); s.push(integer(op1 - op2)); oben auf dem Stapel liegt jetzt: 2 3 3 (2 + 5) = 6 Berechnung mit UPN-Rechner: 3 2-5 + - 736 / 763
Die Klasse Stack Stack<Integer> s = new Stack<Integer>(); s.push(new Integer(3)); s.push(new Integer(2)); s.push(new Integer(-5)); int op2 = s.pop().intvalue(); int op1 = s.pop().intvalue(); s.push(integer(op1 + op2)); op2 = s.pop().intvalue(); op1 = s.pop().intvalue(); s.push(integer(op1 - op2)); oben auf dem Stapel liegt jetzt: 3 3 (2 + 5) = 6 Berechnung mit UPN-Rechner: 3 2-5 + - 737 / 763
Die Klasse Stack Stack<Integer> s = new Stack<Integer>(); s.push(new Integer(3)); s.push(new Integer(2)); s.push(new Integer(-5)); int op2 = s.pop().intvalue(); int op1 = s.pop().intvalue(); s.push(integer(op1 + op2)); op2 = s.pop().intvalue(); op1 = s.pop().intvalue(); s.push(integer(op1 - op2)); oben auf dem Stapel liegt jetzt: -3 3 3 (2 + 5) = 6 Berechnung mit UPN-Rechner: 3 2-5 + - 738 / 763
Die Klasse Stack Stack<Integer> s = new Stack<Integer>(); s.push(new Integer(3)); s.push(new Integer(2)); s.push(new Integer(-5)); int op2 = s.pop().intvalue(); int op1 = s.pop().intvalue(); s.push(integer(op1 + op2)); op2 = s.pop().intvalue(); op1 = s.pop().intvalue(); s.push(integer(op1 - op2)); oben auf dem Stapel liegt jetzt: 3 3 (2 + 5) = 6 Berechnung mit UPN-Rechner: 3 2-5 + - 739 / 763
Die Klasse Stack Stack<Integer> s = new Stack<Integer>(); s.push(new Integer(3)); s.push(new Integer(2)); s.push(new Integer(-5)); int op2 = s.pop().intvalue(); int op1 = s.pop().intvalue(); s.push(integer(op1 + op2)); op2 = s.pop().intvalue(); op1 = s.pop().intvalue(); s.push(integer(op1 - op2)); oben auf dem Stapel liegt jetzt: 3 (2 + 5) = 6 Berechnung mit UPN-Rechner: 3 2-5 + - 740 / 763
Die Klasse Stack Stack<Integer> s = new Stack<Integer>(); s.push(new Integer(3)); s.push(new Integer(2)); s.push(new Integer(-5)); int op2 = s.pop().intvalue(); int op1 = s.pop().intvalue(); s.push(integer(op1 + op2)); op2 = s.pop().intvalue(); op1 = s.pop().intvalue(); s.push(integer(op1 - op2)); oben auf dem Stapel liegt jetzt: 6 3 (2 + 5) = 6 Berechnung mit UPN-Rechner: 3 2-5 + - 741 / 763
Die Klasse Stack - Autoboxing Stack<Integer> s = new Stack<Integer>(); s.push(3); s.push(2); s.push(-5); int op2 = s.pop(); int op1 = s.pop(); s.push(op1 + op2); op2 = s.pop(); op1 = s.pop(); s.push(op1 - op2); Funktioniert auch so Dank Autoboxing 742 / 763
Die Klasse Stack - Autoboxing Stack<String> s = new Stack<String>(); s.push("!"); s.push("java"); Funktioniert auch s.push("lernen"); für String-Objekte s.push("wir"); String info1 = s.pop(); String info2 = s.pop(); System.out.println(info1 + info2); //wirlernen 743 / 763
Die Klasse Stack - Autoboxing Stack<Double> s = new Stack<Double>(); s.push(1.2); s.push(3d); s.push(1.0); s.push(4.5); double zahl1 = s.pop(); double zahl2 = s.pop(); System.out.println(zahl1 + zahl2); //5.5 und auch für Double- Objekte 744 / 763
Die Klasse Stack - Autoboxing Autoboxing macht keine implizite Typumwandlung import java.util.*; public class Main { public static void main (String [] args) { Stack<Double> s = new Stack<Double>(); s.push(1.2); s.push(3); //Fehler 745 / 763