Zorbing

[AuD]Stadtplan

Jun 16th, 2013
274
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.04 KB | None | 0 0
  1. import simpleio.*; //aus audlib
  2.  
  3. import java.util.Iterator;
  4. import java.util.LinkedList;
  5. import java.util.List;
  6.  
  7. /**
  8.  * Stadplan
  9.  * Diese Klasse kapselt die Orte und Strassen eines Stadplanes
  10.  * @author IFIS
  11.  * @version 1.1
  12.  */
  13. public class Stadtplan {
  14.  
  15.     private List<Ort> orte;         // Menge der Orte
  16.     private List<Strasse> strassen; // Menge der Strassen
  17.     private boolean[][] A;          // Adjazenzmatrix
  18.     private List<Ort> bereitsBesuchteOrte;
  19.  
  20.  
  21.     /**
  22.      * Implementierung zu Aufgabe 1.a)
  23.      * Gibt alle direkten Nachfolger des uebergebenen Knotens in einer Liste zurueck.
  24.      * @param startOrt der Startknoten
  25.      */
  26.     public List<Ort> getDirekteNachfolger(Ort startOrt) {
  27.         List<Ort> nachfolger = new LinkedList<Ort>();
  28.  
  29.         Iterator<Strasse> it = strassen.iterator();
  30.         Strasse s;
  31.         while (it.hasNext()) {
  32.             s = it.next();
  33.             if (s.getStartOrt() == startOrt) {
  34.                 nachfolger.add(s.getZielOrt());
  35.             } else if (s.getZielOrt() == startOrt && !s.isGerichtet()) {
  36.                 nachfolger.add(s.getStartOrt());
  37.             }
  38.         }
  39.  
  40.         return nachfolger;
  41.     }
  42.  
  43.  
  44.     /**
  45.      * Implementierung zu Aufgabe 1.b)
  46.      * Gibt alle direkten Vorgaenger des uebergebenen Knotens in einer Liste zurueck.
  47.      * @param zielOrt der Zielknoten
  48.      */
  49.     public List<Ort> getDirekteVorgaenger(Ort zielOrt) {
  50.         List<Ort> vorgaenger = new LinkedList<Ort>();
  51.  
  52.         Iterator<Strasse> it = strassen.iterator();
  53.         Strasse s;
  54.         while (it.hasNext()) {
  55.             s = it.next();
  56.             if (s.getZielOrt() == zielOrt) {
  57.                 vorgaenger.add(s.getStartOrt());
  58.             } else if (s.getStartOrt() == zielOrt && !s.isGerichtet()) {
  59.                 vorgaenger.add(s.getZielOrt());
  60.             }
  61.         }
  62.  
  63.         return vorgaenger;
  64.     }
  65.  
  66.  
  67.     /**
  68.      * Berechnet die Adjazenzmatrix und speichert sie in dem privaten Attribut A
  69.      */
  70.     private void calcAdjazenzmatrix() {
  71.         int knotenzahl = orte.size();
  72.         A = new boolean[knotenzahl][knotenzahl];
  73.         for (int i = 0; i < knotenzahl; i++) {
  74.             List<Ort> direkteNachfolger = getDirekteNachfolger(orte.get(i));
  75.             Iterator<Ort> itNachfolger = direkteNachfolger.iterator();
  76.             Ort nachfolger;
  77.             while (itNachfolger.hasNext()) {
  78.                 nachfolger = itNachfolger.next();
  79.                 A[i][nachfolger.getNummer()-1] = true;
  80.             }
  81.             A[i][i] = true;
  82.         }
  83.         for (int j = 0; j < knotenzahl; j++) {
  84.             for (int i = 0; i < knotenzahl; i++) {
  85.                 if (A[i][j]) {
  86.                     for (int k = 0; k < knotenzahl; k++) {
  87.                         if (A[j][k]) {
  88.                             A[i][k] = true;
  89.                         }
  90.                     }
  91.                 }
  92.             }
  93.         }
  94.     }
  95.  
  96.  
  97.     /**
  98.      * Implementierung zu Aufgabe 1.c)
  99.      * Gibt alle von dem uebergebenen Knoten erreichbaren Orte in einer Liste zurueck.
  100.      * @param startOrt der Startknoten
  101.      * @return alle erreichbaren Orte
  102.      */
  103.     public List<Ort> getErreichbarOrte(Ort startOrt) {
  104.         calcAdjazenzmatrix();
  105.  
  106.         List<Ort> erreichbareOrte = new LinkedList<Ort>();
  107.         int ortnummer = startOrt.getNummer()-1;
  108.         int knotenzahl = orte.size();
  109.         for (int j = 0; j < knotenzahl; j++) {
  110.             if (A[ortnummer][j]) {
  111.                 erreichbareOrte.add(orte.get(j));
  112.             }
  113.         }
  114.  
  115.         return erreichbareOrte;
  116.     }
  117.    
  118.    
  119.     /**
  120.      * Implementierung zu Aufgabe 1.d)
  121.      * Gibt zurueck, ob ein Weg von startOrt zu zielOrt existiert.
  122.      * @param startOrt der Startknoten
  123.      * @param zielOrt der Zielknoten
  124.      * @return ob ein Weg existiert
  125.      */
  126.     public boolean existiertWeg(Ort startOrt, Ort zielOrt) {
  127.         calcAdjazenzmatrix();
  128.         return A[startOrt.getNummer()-1][zielOrt.getNummer()-1];
  129.     }
  130.  
  131.  
  132.     /**
  133.      * Gibt das Ergebnis der Tiefensuche von Knoten startOrt zurueck
  134.      * @param startOrt der Startknoten
  135.      * @return das Ergebnis der Tiefensuche
  136.      */
  137.     private List<Ort> recTiefensuche(Ort startOrt) {
  138.         List<Ort> rueckgabe = new LinkedList<Ort>();
  139.         List<Ort> nachfolger = getDirekteNachfolger(startOrt);
  140.         Iterator<Ort> it = nachfolger.iterator();
  141.  
  142.         bereitsBesuchteOrte.add(startOrt);
  143.         rueckgabe.add(startOrt);
  144.         Ort ort;
  145.         while (it.hasNext()) {
  146.             ort = it.next();
  147.             if (!bereitsBesuchteOrte.contains(ort)) {
  148.                 rueckgabe.addAll(recTiefensuche(ort));
  149.             }
  150.         }
  151.  
  152.         return rueckgabe;
  153.     }
  154.  
  155.  
  156.     /**
  157.      * Implementierung zu Aufgabe 1.e)
  158.      * @param a
  159.      */
  160.     public void tiefensuche(Ort a) {
  161.         bereitsBesuchteOrte = new LinkedList<Ort>();
  162.         List<Ort> DFS = recTiefensuche(a);
  163.  
  164.         System.out.println("Tiefensuche von Ort " + a + ":");
  165.         Iterator<Ort> itDFS = DFS.iterator();
  166.         while (itDFS.hasNext()) {
  167.             System.out.println(itDFS.next());
  168.         }
  169.     }
  170.  
  171.  
  172.  
  173.     /**
  174.      * Main-Methode als Einstiegspunkt.
  175.      */
  176.     public static void main(String[] args) {
  177.         //Stadtplan erzeugen und aus Datei einlesen
  178.         Stadtplan plan = new Stadtplan();
  179.         plan.einlesen("luebeck_city.txt");
  180.  
  181.         /**
  182.          * Testen der zu implementierenden Methoden
  183.          */
  184.  
  185.         Ort ort9 = plan.getOrt(9);
  186.         /**
  187.          * Aufgabe 1.a)
  188.          */
  189.         List<Ort> direkteNachfolger = plan.getDirekteNachfolger(ort9);
  190.         System.out.println("Direkte Nachfolger von " + ort9 + " sind:");
  191.         Iterator<Ort> itNachfolger = direkteNachfolger.iterator();
  192.         Ort nachfolger;
  193.         while (itNachfolger.hasNext()) {
  194.             nachfolger = itNachfolger.next();
  195.             System.out.println(nachfolger);
  196.         }
  197.         /*
  198.          *  Direkte Nachfolger von Theater Combinale (9) sind:
  199.          *  Marke13 (42)
  200.          *  Hüx (18)
  201.          *  Sporthalle (47)
  202.          */
  203.  
  204.         System.out.println();
  205.         /**
  206.          * Aufgabe 1.b)
  207.          */
  208.         List<Ort> direkteVorgaenger = plan.getDirekteVorgaenger(ort9);
  209.         System.out.println("Direkte Vorgaenger von " + ort9 + " sind:");
  210.         Iterator<Ort> itVorgaenger = direkteVorgaenger.iterator();
  211.         Ort vorgaenger;
  212.         while (itVorgaenger.hasNext()) {
  213.             vorgaenger = itVorgaenger.next();
  214.             System.out.println(vorgaenger);
  215.         }
  216.         /*
  217.          * Direkte Vorgaenger von Theater Combinale (9) sind:
  218.          *  Hüx (18)
  219.          *  Cafe Calma (48)
  220.          */
  221.  
  222.         System.out.println();
  223.         /**
  224.          * Aufgabe 1.c)
  225.          */
  226.         List<Ort> erreichbarOrte = plan.getErreichbarOrte(ort9);
  227.         System.out.println("Erreichbare Orte von " + ort9 + " sind:");
  228.         Iterator<Ort> itErreichbar = erreichbarOrte.iterator();
  229.         Ort ort;
  230.         while (itErreichbar.hasNext()) {
  231.             ort = itErreichbar.next();
  232.             System.out.println(ort);
  233.         }
  234.         /*
  235.          * Erreichbare Orte von Theater Combinale (9) sind:
  236.          *  Theater Combinale (9)
  237.          *  Hauptpost (12)
  238.          *  Hüx (18)
  239.          *  Sternschnuppe (24)
  240.          *  Marke13 (42)
  241.          *  Sporthalle (47)
  242.          *  Marke18 (49)
  243.          *  Marke19 (50)
  244.          */
  245.  
  246.         System.out.println();
  247.         /**
  248.          * Aufgabe 1.d)
  249.          */
  250.         Ort ort49 = plan.getOrt(49);
  251.         System.out.println("Existiert ein Weg von " + ort9 + " nach " + ort49 + ": " + plan.existiertWeg(ort9, ort49));
  252.  
  253.         Ort ort10 = plan.getOrt(10);
  254.         Ort ort36 = plan.getOrt(36);
  255.         System.out.println("Existiert ein Weg von " + ort10 + " nach " + ort36 + ": " + plan.existiertWeg(ort10, ort36));
  256.         /*
  257.          * Existiert ein Weg von Theater Combinale (9) nach Marke18 (49): true
  258.          * Existiert ein Weg von Johannis-Kloster (10) nach Marke7 (36): false
  259.          */
  260.        
  261.         System.out.println();
  262.         /**
  263.          * Aufgabe 1.e)
  264.          */
  265.         plan.tiefensuche(ort10);
  266.         /*
  267.          * Tiefensuche von Ort Johannis-Kloster (10):
  268.          *  Johannis-Kloster (10)
  269.          *  Marke19 (50)
  270.          *  Sternschnuppe (24)
  271.          *  Marke18 (49)
  272.          *  Hauptpost (12)
  273.          *  Ordnungsamt (11)
  274.          */
  275.     }
  276.  
  277.  
  278.  
  279.     /**
  280.      * Die Methode liest die übergebene Definition eines Stadplanes ein und generiert
  281.      * Ort- und Strasse-Objekte. Die Datei muss existieren und ein gültiges Format
  282.      * besitzen.
  283.      * @param dateiname der Dateiname
  284.      */
  285.     public void einlesen(String dateiname) {
  286.         orte = new LinkedList<Ort>();
  287.         strassen = new LinkedList<Strasse>();
  288.  
  289.         Eingabe def = Eingabe.oeffnen(dateiname);
  290.  
  291.         int anzOrte = Integer.parseInt(def.readString());       // Anzahl der Orte
  292.         int anzStrassen = Integer.parseInt(def.readString());   // Anzahl der Strassen
  293.  
  294.         for (int i = 0; i < anzOrte; i++) {                     // Schleife über alle Orte
  295.             String zeile = def.readString();
  296.             int semikolon = zeile.indexOf(';');                 // Position des ersten Semikolons
  297.             String nummer = zeile.substring(0, semikolon);      // Extraktion der Nummer
  298.             String name = zeile.substring(semikolon + 1, zeile.length()); // Extraktion des Namens
  299.             Ort ort = new Ort(Integer.parseInt(nummer), name);  // Ort generieren
  300.             orte.add(ort);                                      // Ort in Liste einfügen
  301.         }
  302.  
  303.         for (int j = 0; j < anzStrassen; j++) {
  304.             String zeile = def.readString();
  305.             int semikolon = zeile.indexOf(';');                 // Position des ersten Semikolons
  306.             String nummer = zeile.substring(0, semikolon);      // Extraktion der Nummer
  307.             zeile = zeile.substring(semikolon + 1, zeile.length()); // Zeile verkürzen
  308.  
  309.             semikolon = zeile.indexOf(';');                     // Position des ersten Semikolons
  310.             String name = zeile.substring(0, semikolon);        // Extraktion des Namens
  311.             zeile = zeile.substring(semikolon + 1, zeile.length()); // Zeile verkürzen
  312.  
  313.             semikolon = zeile.indexOf(';');                     // Position des ersten Semikolons
  314.             String start = zeile.substring(0, semikolon);       // Extraktion des Startortes
  315.             zeile = zeile.substring(semikolon + 1, zeile.length()); // Zeile verkürzen
  316.  
  317.             semikolon = zeile.indexOf(';');                     // Position des ersten Semikolons
  318.             String ziel = zeile.substring(0, semikolon);        // Extraktion des Zielortes
  319.             zeile = zeile.substring(semikolon + 1, zeile.length()); // Zeile verkürzen
  320.  
  321.             semikolon = zeile.indexOf(';');                     // Position des ersten Semikolons
  322.             String richtung = zeile.substring(0, semikolon);    // Extraktion der Richtung
  323.             String gewicht = zeile.substring(semikolon + 1, zeile.length()); // Extraktion der Länge
  324.  
  325.             Strasse strasse = new Strasse(Integer.parseInt(nummer), name); // Strasse erzeugen
  326.             int startOrtNr = Integer.parseInt(start);
  327.             Ort startOrt = orte.get(startOrtNr - 1);            // Startort aus Liste holen
  328.             strasse.setBeginn(startOrt);
  329.             int zielOrtNr = Integer.parseInt(ziel);
  330.             Ort zielOrt = orte.get(zielOrtNr - 1);              // Zielort aus Liste holen
  331.             strasse.setZiel(zielOrt);
  332.  
  333.             strasse.setGerichtet(richtung.toLowerCase().equals("gerichtet")); // Richtung wird gesetzt
  334.  
  335.             strasse.setGewicht(Integer.parseInt(gewicht));
  336.  
  337.             strassen.add(strasse); // Strasse zu Liste hinzufügen
  338.         }
  339.     }
  340.  
  341.     /**
  342.      * liefert der Ort zu einer gegebenen Nummer zurück
  343.      * @param nummer die Nummer des Ortes
  344.      * @return der zugehörige Ort
  345.      */
  346.     public Ort getOrt(int nummer) {
  347.         return orte.get(nummer - 1);
  348.     }
  349.  
  350.  
  351. }
Advertisement
Add Comment
Please, Sign In to add comment