Datenstrukturen in Java Dr. Horst Treiblmaier Abteilung für Wirtschaftsinformatik WU Wien Datenstrukturen Datenstrukturen Arrays Containerklassen Collections • List • Set ArrayList LinkedList Maps Arrays (Wiederholung) n Datenelemente oder Objekte eines Datentyps auf dessen einzelne Elemente mit Integer-Indizes zugegriffen werden kann Deklaration: n Instanziierung (bei Objektdatentypen): n n Datentyp[] variablenname = new Datentyp[länge] variablenname[] = new Klasse(); ArrayBeispiel1 Aufgabe Verwenden Sie die Methode fill der Klasse Arrays (im Paket java.util um ein int-Array der Länge 10 mit dem Wert 7 füllen. Geben Sie dann das Array aus. ArrayBeispiel1 Lösung import java.util.*; public class ArrayBeispiel1 { public static void main(String args[]) { int[] werte = new int[4]; for (int i = 0; i < werte.length; i++) { Arrays.fill(werte, 7); } for (int i = 0; i < werte.length; i++) { System.out.println(werte[i]); } } } ArrayBeispiel2 Aufgabe Verwenden Sie die Methode sort der Klasse Arrays im Paket java.util um ein int-Array der Länge 4 zu sortieren. Geben Sie das Array dabei vor und nach dem Sortieren aus. (Anmerkung: füllen Sie das Array vorher mit beliebigen Werten). Geben Sie dann das Array aus. ArrayBeispiel2 Lösung import java.util.*; class ArrayBeispiel2 { public static void main(String args[]) { int[] werte = new int[4]; werte[0] = 6; werte[1] = 3; werte[2] = 9; werte[3] = 1; for (int i = 0; i <= 3; i++) { System.out.println("Vor dem Sortieren: " + werte[i]); } Arrays.sort(werte); for (int i = 0; i <=3; i++) {{ System.out.println("Nach dem Sortieren: " + werte[i]); } } } } ArrayBeispiel3 Aufgabe Verwenden Sie die Methode binarySearch der Klasse Arrays im Paket java.util um ein int-Array der Länge 6 zu durchsuchen. (Anmerkung: füllen Sie das Array mit beliebigen Werten und sortieren Sie diese. Geben Sie die Ergebnisse vorher und nachher aus.). Geben Sie dann die gesuchte Stelle aus wobei sie selbst einen Suchwert auswählen ArrayBeispiel3 Lösung import java.util.*; class ArrayBeispiel3 { public static void main(String args[]) { int[] werte = new int[4]; werte[0] = 6; werte[1] = 4; werte[2] = 8; werte[3] = 2; System.out.println("Vor dem Sortieren: "); for (int i = 0; i <werte.length; i++) { System.out.println(werte[i]); } Arrays.sort(werte); System.out.println("Nach dem Sortieren: "); for (int i = 0; i <werte.length; i++) { System.out.println(werte[i]); } int gesuchteStelle = Arrays.binarySearch(werte, 6); System.out.println("Wert an der Stelle " + gesuchteStelle); } } List • ArrayList: Liste als Array implementiert, schneller Zugriff (Indizierung), aber langsames Einfügen und Löschen • LinkedList: Verkettete Liste, langsamer Zugriff, aber schnelles Einfügen und Löschen ArrayList • Eine ArrayList kann als Array aufgefasst werden das beliebig erweitert werden kann. • Die Klasse ArrayList findet sich im Paket java.util. • In einer ArrayList befinden sich nur Objekte. • add() fügt ein Objekt dazu • get(int index) holt ein Objekt aus der List • remove(int index) entfernt ein Objekt. • size() zeigt die Länge an ArrayList1 Beispiel (A) class Student { String name; Student(String wert) { name = wert; } void schreibeName() { System.out.println(name); } } ArrayList1 Beispiel (B) import java.util.*; public class ArrayList1 { public static void main (String args[]) { Erzeugen einer ArrayList Student anna = new Student("Anna"); Student paul = new Student("Paul"); ArrayList teilnehmer = new ArrayList(); teilnehmer.add(anna); teilnehmer.add(paul); for (int i = 0; i < teilnehmer.size(); i++) { Hinzufügen der Teilnehmer ((Student)teilnehmer.get(i)).schreibeName(); } } } Auslesen der Teilnehmer. Explizites Casting(!) der Objekte ArrayList2 Aufgabe Erstellen Sie ein Klasse Musiker mit einem Konstruktor Musiker ("Name", "Song"); Zusätzlich solle es zwei Methoden geben welche es ermöglichen den Namen bzw. den Song auszulesen (zeigeName(), zeigeSong()). Erstellen Sie in einer anderen Klasse eine ArrayList namens meineMusiker in welcher Sie dann 3 Künstler samt deren Songs eingeben. Lesen Sie diese Daten mit einer for-Schleife wieder aus. ArrayList2 Lösung (A) public class Musiker { String name, song; Musiker(String name, String song) { this.name = name; this.song = song; } String zeigeName() { return name; } String zeigeSong() { return song; } } ArrayList2 Lösung (B) import java.util.*; public class ArrayList2 { public static void main(String args[]) { ArrayList meineMusiker = new ArrayList(); meineMusiker.add(new Musiker("Williams", "Feel")); meineMusiker.add(new Musiker("Flames", "Everytime")); meineMusiker.add(new Musiker("U2", "Pride")); for (int i = 0; i < meineMusiker.size(); i++) { String name = ((Musiker)meineMusiker.get(i)).zeigeName(); System.out.println(name); String song = ((Musiker)meineMusiker.get(i)).zeigeSong(); System.out.println(song); } } } LinkedList boolean add(Object o) add (int i, Object o) boolean remove(int i) boolean remove(Object o) int indexOf(Object o) int lastIndexOf(Object o) Object get(int index) Einfügen von o am Ende Einfügen an Postion i Löschen des Objekts an der Stelle i Löschen des Objekts o Erstes Auftreten von Objekt o Letztes Auftreten von Objekt o Liefert das Objekt der Stelle index zurück LinkedList1 Beispiel (A) class Freunde { String name; int telefonnummer; Freunde (String name, int telefonnummer) { this.name = name; this.telefonnummer = telefonnummer; } } LinkedList1 Beispiel (B) import java.util.*; class LinkedList1 { public static void main(String args[]) { LinkedList meineListe= new LinkedList(); Freunde aktuellesObjekt = new Freunde("Anton", 7324882); meineListe.add(aktuellesObjekt); aktuellesObjekt = new Freunde("Berta", 3547698); meineListe.add(aktuellesObjekt); aktuellesObjekt = new Freunde("Caesar", 3469273); meineListe.add(aktuellesObjekt); for (int i = 0; i < meineListe.size(); i++) { aktuellesObjekt = (Freunde)meineListe.get(i); System.out.println(aktuellesObjekt.name); System.out.println(aktuellesObjekt.telefonnummer); } } } LinkedList1 Beispiel (C) Einfügen eines Elements innerhalb der Liste aktuellesObjekt = new Freunde("Baula", 5268833); meineListe.add(1, aktuellesObjekt); for (int i = 0; i < meineListe.size(); i++) { aktuellesObjekt = (Freunde)meineListe.get(i); System.out.println(aktuellesObjekt.name); System.out.println(aktuellesObjekt.telefonnummer); } LinkedList2 Aufgabe Erstellen Sie ein Klasse Nobelpreistraeger mit einem Konstruktor Musiker ("Name", "Kategorie"); Zusätzlich solle es zwei Methoden geben welche es ermöglichen den Namen bzw. die Kategorie auszulesen (zeigeName(), zeigeKategorie()). Erstellen Sie in einer anderen Klasse eine LinkedList namens meineNobelpreistraeger in welcher Sie dann 3 Nobelpreisträger samt deren Kategorie eingeben. Lesen Sie diese Daten mit einer for-Schleife wieder aus. LinkedList2 Lösung (A) public class Nobelpreistraeger { String name; String kategorie; Nobelpreistraeger(String name, String kategorie) { this.name = name; this.kategorie = kategorie; } String zeigeName() { return name; } String zeigeKategorie() { return kategorie; } } LinkedList2 Lösung (B) import java.util.*; public class LinkedList2 { public static void main (String args[]) { LinkedList nobelpreise = new LinkedList(); Nobelpreistraeger meinNobelpreistraeger = new Nobelpreistraeger("Carter", "Frieden"); nobelpreise.add(meinNobelpreistraeger); meinNobelpreistraeger = new Nobelpreistraeger ("Grass", "Literatur"); nobelpreise.add(meinNobelpreistraeger); nobelpreise.add(new Nobelpreistraeger("Kahneman", "Wirtschaft")); for(int i = 0; i<nobelpreise.size(); i++) { String derName = ((Nobelpreistraeger)nobelpreise.get(i)).zeigeName(); System.out.print(derName + ": "); String dieKategorie = ((Nobelpreistraeger)nobelpreise.get(i)).zeigeKategorie(); System.out.println(dieKategorie); } } } Set Kann keine gleichen Objekte enthalten import java.util.*; class HashTest { public static void main(String[] args) { HashSet meinSet = new HashSet(); meinSet.add("eins"); meinSet.add("zwei"); meinSet.add("zwei"); System.out.println(meinSet); } } HashSet Aufgabe Erstellen Sie ein Klasse Lottozahlen in der Sie ein HashSet mit dem Namen zahlenpool verwenden. In diesen zahlenpool füllen Sie 6 Zufallszahlen zwischen 1 und 45 wobei keine Zahl doppelt vorkommen darf. Geben Sie dieses HashSet anschließend aus. Tipps: 1) Die Methode add() der Klasse HashSet verlangt ein Objekt; d.h. sie müssen die (int-)Zahlen vorher "verpacken" (=wrappen). Verwenden Sie dazu die Klasse Integer. 2) Nützen Sie den Rückgabewert der Methode add() um zu überprüfen ob das Element bereits vorhanden ist. Holen Sie die notwendigen Informationen aus der Java API. 3) Für die Ausgabe benutzen Sie die Methode System.out.println() der sie das HashSet übergeben. HashSet Lösung import java.util.*; class Lottozahlen { public static void main(String[] args) { boolean neueZahl; int zahl, anzahl; HashSet zahlenpool = new HashSet(); Integer aktuell; anzahl = 0; while(anzahl < 6) { zahl = (int)((Math.random()*45)+1); aktuell = new Integer(zahl); neueZahl = zahlenpool.add(aktuell); if(!neueZahl) { continue; } anzahl++; } System.out.println("Die Lottozahlen:"); System.out.println(zahlenpool); } } Map Dienen der Verwaltung von Wertepaaren. Schlüssel – Objekt Paare von Daten werden in Tabellen abgelegt z.B. good --gut bad --schlecht young --jung old --alt Schlüssel Objekt Map Die Schlüssel müssen eindeutig sein. Eingefügt wird mit der put()-Methode: put (Object key, Object value) Aufgerufen wird mit der get()-Methode: Object get(Object key) Map Beispiel import java.util.*; public class Lexikon { public static void main(String args[]) { HashMap tabelle = new HashMap(); tabelle.put("good", "gut"); tabelle.put("bad", "schlecht"); tabelle.put("young", "jung"); tabelle.put("old", "alt"); String ergebnis1 = (String)tabelle.get("young"); System.out.println(ergebnis1); String ergebnis2 = (String)tabelle.get("bad"); System.out.println(ergebnis2); String ergebnis3 = (String)tabelle.get("hello"); System.out.println(ergebnis3); } } Map Aufgabe Erstellen Sie ein Klasse Buchliste in der Sie eine HashMap mit dem Namen meineListe verwenden. Geben Sie 3 Autoren (Nachnamen) und jeweils einen Buchtitel ein. Suchen Sie dann nach 2 Autoren und geben Sie den Namen des Autoren und den Buchtitel aus. Geben Sie zusätzlich die Größe (=Länge) der Liste aus. Suchen Sie dazu aus der Java-API die geeignete Methode. Map Lösung import java.util.*; public class Buchliste { public static void main(String[] args) { HashMap meineListe = new HashMap(); meineListe.put("Toole", "A Confederacy of Dunces"); meineListe.put("Grisham", "The King of Torts"); meineListe.put("Patterson", "Four Blind Mice"); System.out.println("Toole: " + (String)meineListe.get("Toole")); System.out.println("Grisham: " + (String)meineListe.get("Grisham")); System.out.println("Groesse der Liste: " + meineListe.size()); } }