package info3; /** * * Info 3 Blatt 4, Aufgabe 1 * * @author fieberfn, hatjeki * */ import java.io.*; public class Politicians { // Wurzel unserer Liste mit Politikern. private TrunkList anchor = null; // * Fügt einen Politiker politician mit dem Amt trunk das dieser im Jahr // * year ausgeübt hat bzw ausübt in unsere verkettete Liste ein. Wir nehmen // * an dass sich die Zeiträume der Amtsinhabung nicht überschneiden. */ public void add (String politician, String trunk, int beginYear, int endYear) { // Wenn die Liste noch leer ist, ersten Eintrag machen. if (anchor == null) { anchor = new TrunkList(trunk, new PoliticianList(politician, beginYear, endYear)); // Liste ist nicht leer, wenn es das Amt trunk schon gibt in die Teilliste einfügen. } else { assert(anchor != null) : "anchor == null, nicht erwartet!"; // Temporäre Referenz mit der durch die Liste der Ämter gegangen wird. TrunkList trunkTmp = anchor; // Schauen ob es das Amt schon gibt. Wenn ja, da einfügen, ansonsten neu kreieren. while (trunkTmp.next != null && !trunkTmp.trunk.equalsIgnoreCase(trunk)) { trunkTmp = trunkTmp.next; //System.out.println("Amt "+trunk+" noch nicht gefunden"); } // Ist das Amt zufällig das erste in unserer Liste von Ämtern? if (trunkTmp.trunk.equalsIgnoreCase(trunk)) { PoliticianList polTmp = trunkTmp.politicians; while (polTmp.next != null && beginYear > polTmp.beginYear) { polTmp = polTmp.next; } // Der Politiker hat sein Amt am spätesten von bisher allen aufgenommen System.out.println("beginYear: "+beginYear+", in Liste: "+polTmp.beginYear); if (polTmp == trunkTmp.politicians) { // Referenz auf nächstes Element zwischenspeichern, neues machen, Referenzen richtig hängen. PoliticianList successor = trunkTmp.politicians; trunkTmp.politicians = new PoliticianList(politician, beginYear, endYear, successor); } else if (polTmp.next == null) { polTmp.next = new PoliticianList (politician, beginYear, endYear); // Der Politiker war/ist früher oder im gleichen Jahr im Amt wie ein anderer. } else { // Referenz auf nächstes Element zwischenspeichern, neues machen, Referenzen richtig hängen. PoliticianList successor = polTmp.next; polTmp.next = new PoliticianList(politician, beginYear, endYear, successor); } } else if (trunkTmp.next == null) { trunkTmp.next = new TrunkList(trunk, new PoliticianList(politician, beginYear, endYear)); // Das gesuchte Amt scheint es schon zu geben, also politician in die Liste einfügen. } else { assert(trunkTmp != null) : "trunkTemp = null, obwohl es das hier nicht sein sollte"; assert(trunkTmp.trunk.equalsIgnoreCase(trunk)) : "Amt in Knoten != Amt gesucht"; // Temporäre Referenz mit der durch die Liste der Politiker gegangen wird. PoliticianList polTmp = trunkTmp.politicians; while (polTmp.next != null && beginYear > polTmp.beginYear) { polTmp = polTmp.next; } // Der Politiker hat sein Amt am spätesten von bisher allen aufgenommen System.out.println("polTemp: "+polTmp+", trTmp.pol.ne: "+ trunkTmp.politicians.next); /*if (polTmp == trunkTmp.politicians) { System.out.println("foobar"); // Referenz auf nächstes Element zwischenspeichern, neues machen, Referenzen richtig hängen. PoliticianList successor = trunkTmp.politicians; trunkTmp.politicians = new PoliticianList(politician, beginYear, endYear, successor); } else*/ if (polTmp.next == null) { polTmp.next = new PoliticianList (politician, beginYear, endYear); // Der Politiker war/ist früher oder im gleichen Jahr im Amt wie ein anderer. } else { // Referenz auf nächstes Element zwischenspeichern, neues machen, Referenzen richtig hängen. PoliticianList successor = polTmp.next; polTmp.next = new PoliticianList(politician, beginYear, endYear, successor); } } } }// end public procedure add ((String politician, String trunk, // int beginYear, int endYear) public void addFile (String filename) throws FileNotFoundException { File datei = new File(filename); //FileReader leser = new FileReader(datei); BufferedReader b = new BufferedReader(new FileReader(datei)); String politician = " ", trunk; int beginYear, endYear; try { while (politician!= null && !politician.equals(" ")) { politician = b.readLine(); trunk = b.readLine(); beginYear = Integer.parseInt(b.readLine()); endYear = Integer.parseInt(b.readLine()); add(politician, trunk, beginYear, endYear); } } catch (FileNotFoundException e) { System.out.println("Fehler beim Einlesen des Strings. Eingabe bitte wiederholen"); } } public void print() { // Temporäre Variablen zum durchwandern der Listenliste. TrunkList trunkTmp = anchor; PoliticianList polTmp = null; // wenn trunkTmp != null ist sollten wir mindenstens einen Politiker haben. while (trunkTmp != null) { polTmp = trunkTmp.politicians; while (polTmp != null) { //System.out.print(polTmp.politicianName+", "+trunkTmp.trunk+", "); //System.out.println(polTmp.beginYear+"-"+polTmp.endYear); System.out.println(polTmp.politicianName + ": "+polTmp.beginYear); polTmp = polTmp.next; } trunkTmp = trunkTmp.next; } } // debug and Testfunktion public int printNumberOfTrunks () { TrunkList iterator = anchor; int counter = 0; while (iterator != null) { counter++; iterator = iterator.next; } //System.out.println("Counter war "+counter); return counter; } /** * @param args */ public static void main(String[] args) { Politicians oink = new Politicians(); // oink.add("Willy Brandt", "Bundeskanzler", 1969, 1974); // oink.add("Johannes Rau", "Bundespräsident", 1999, 2004); // oink.add("Konrad Adenauer", "Bundeskanzler", 1949, 1963); // oink.add("Willy Brandt", "Bundeskanzler", 1969, 1974); // oink.add("Konrad Adenauer", "Bundeskanzler", 1949, 1963); // oink.add("Johannes Rau", "Bundespräsident", 1999, 2004); oink.addFile("politiker.txt"); oink.print(); System.out.println("Es gibt "+oink.printNumberOfTrunks()+" Ämter"); } }