Advertisement
Guest User

Untitled

a guest
Dec 1st, 2015
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.51 KB | None | 0 0
  1. public class List<ContentType> {
  2.  
  3.   /* --------- Anfang der privaten inneren Klasse -------------- */
  4.  
  5.   public class ListNode {
  6.  
  7.     private ContentType contentObject;
  8.     private ListNode next;
  9.  
  10.     /**
  11.      * Ein neues Objekt wird erschaffen. Der Verweis ist leer.
  12.      *
  13.      * @param pContent das Inhaltsobjekt vom Typ ContentType
  14.      */
  15.     public ListNode(ContentType pContent) {
  16.       contentObject = pContent;
  17.       next = null;
  18.     }
  19.  
  20.     /**
  21.      * Der Inhalt des Knotens wird zurueckgeliefert.
  22.      *
  23.      * @return das Inhaltsobjekt des Knotens
  24.      */
  25.     public ContentType getContentObject() {
  26.       return contentObject;
  27.     }
  28.  
  29.     /**
  30.      * Der Inhalt dieses Kontens wird gesetzt.
  31.      *
  32.      * @param pContent das Inhaltsobjekt vom Typ ContentType
  33.      */
  34.     public void setContentObject(ContentType pContent) {
  35.       contentObject = pContent;
  36.     }
  37.  
  38.     /**
  39.      * Der Nachfolgeknoten wird zurueckgeliefert.
  40.      *
  41.      * @return das Objekt, auf das der aktuelle Verweis zeigt
  42.      */
  43.     public ListNode getNextNode() {
  44.       return this.next;
  45.     }
  46.  
  47.     /**
  48.      * Der Verweis wird auf das Objekt, das als Parameter uebergeben
  49.      * wird, gesetzt.
  50.      *
  51.      * @param pNext der Nachfolger des Knotens
  52.      */
  53.     public void setNextNode(ListNode pNext) {
  54.       this.next = pNext;
  55.     }
  56.  
  57.   }
  58.  
  59.   /* ----------- Ende der privaten inneren Klasse -------------- */
  60.  
  61.   // erstes Element der Liste
  62.   ListNode first;
  63.  
  64.   // letztes Element der Liste
  65.   ListNode last;
  66.  
  67.   // aktuelles Element der Liste
  68.   ListNode current;
  69.  
  70.   /**
  71.    * Eine leere Liste wird erzeugt.
  72.    */
  73.   public List() {
  74.     first = null;
  75.     last = null;
  76.     current = null;
  77.   }
  78.  
  79.   /**
  80.    * Die Anfrage liefert den Wert true, wenn die Liste keine Objekte enthaelt,
  81.    * sonst liefert sie den Wert false.
  82.    *
  83.    * @return true, wenn die Liste leer ist, sonst false
  84.    */
  85.   public boolean isEmpty() {
  86.     // Die Liste ist leer, wenn es kein erstes Element gibt.
  87.     return first == null;
  88.   }
  89.  
  90.   /**
  91.    * Die Anfrage liefert den Wert true, wenn es ein aktuelles Objekt gibt,
  92.    * sonst liefert sie den Wert false.
  93.    *
  94.    * @return true, falls Zugriff moeglich, sonst false
  95.    */
  96.   public boolean hasAccess() {
  97.     // Es gibt keinen Zugriff, wenn current auf kein Element verweist.
  98.     return current != null;
  99.   }
  100.  
  101.   /**
  102.    * Falls die Liste nicht leer ist, es ein aktuelles Objekt gibt und dieses
  103.    * nicht das letzte Objekt der Liste ist, wird das dem aktuellen Objekt in
  104.    * der Liste folgende Objekt zum aktuellen Objekt, andernfalls gibt es nach
  105.    * Ausfuehrung des Auftrags kein aktuelles Objekt, d.h. hasAccess() liefert
  106.    * den Wert false.
  107.    */
  108.   public void next() {
  109.     if (this.hasAccess()) {
  110.       current = current.getNextNode();
  111.     }
  112.   }
  113.  
  114.   /**
  115.    * Falls die Liste nicht leer ist, wird das erste Objekt der Liste aktuelles
  116.    * Objekt. Ist die Liste leer, geschieht nichts.
  117.    */
  118.   public void toFirst() {
  119.     if (!isEmpty()) {
  120.       current = first;
  121.     }
  122.   }
  123.  
  124.   /**
  125.    * Falls die Liste nicht leer ist, wird das letzte Objekt der Liste
  126.    * aktuelles Objekt. Ist die Liste leer, geschieht nichts.
  127.    */
  128.   public void toLast() {
  129.     if (!isEmpty()) {
  130.       current = last;
  131.     }
  132.   }
  133.  
  134.   /**
  135.    * Falls es ein aktuelles Objekt gibt (hasAccess() == true), wird das
  136.    * aktuelle Objekt zurueckgegeben, andernfalls (hasAccess() == false) gibt
  137.    * die Anfrage den Wert null zurueck.
  138.    *
  139.    * @return das aktuelle Objekt (vom Typ ContentType) oder null, wenn es
  140.    *         kein aktuelles Objekt gibt
  141.    */
  142.   public ContentType getContent() {
  143.     if (this.hasAccess()) {
  144.       return current.getContentObject();
  145.     } else {
  146.       return null;
  147.     }
  148.   }
  149.  
  150.   /**
  151.    * Falls es ein aktuelles Objekt gibt (hasAccess() == true) und pContent
  152.    * ungleich null ist, wird das aktuelle Objekt durch pContent ersetzt. Sonst
  153.    * geschieht nichts.
  154.    *
  155.    * @param pContent
  156.    *            das zu schreibende Objekt vom Typ ContentType
  157.    */
  158.   public void setContent(ContentType pContent) {
  159.     // Nichts tun, wenn es keinen Inhalt oder kein aktuelles Element gibt.
  160.     if (pContent != null && this.hasAccess()) {
  161.       current.setContentObject(pContent);
  162.     }
  163.   }
  164.  
  165.   /**
  166.    * Falls es ein aktuelles Objekt gibt (hasAccess() == true), wird ein neues
  167.    * Objekt vor dem aktuellen Objekt in die Liste eingefuegt. Das aktuelle
  168.    * Objekt bleibt unveraendert.
  169.    * Wenn die Liste leer ist, wird pContent in die Liste eingefuegt und es
  170.    * gibt weiterhin kein aktuelles Objekt (hasAccess() == false).
  171.    * Falls es kein aktuelles Objekt gibt (hasAccess() == false) und die Liste
  172.    * nicht leer ist oder pContent gleich null ist, geschieht nichts.
  173.    *
  174.    * @param pContent
  175.    *            das einzufuegende Objekt vom Typ ContentType
  176.    */
  177.   public void insert(ContentType pContent) {
  178.     if (pContent != null) { // Nichts tun, wenn es keinen Inhalt gibt.
  179.       if (this.hasAccess()) { // Fall: Es gibt ein aktuelles Element.
  180.  
  181.         // Neuen Knoten erstellen.
  182.         ListNode newNode = new ListNode(pContent);
  183.  
  184.         if (current != first) { // Fall: Nicht an erster Stelle einfuegen.
  185.           ListNode previous = this.getPrevious(current);
  186.           newNode.setNextNode(previous.getNextNode());
  187.           previous.setNextNode(newNode);
  188.         } else { // Fall: An erster Stelle einfuegen.
  189.           newNode.setNextNode(first);
  190.           first = newNode;
  191.         }
  192.  
  193.       } else { //Fall: Es gibt kein aktuelles Element.
  194.  
  195.         if (this.isEmpty()) { // Fall: In leere Liste einfuegen.
  196.  
  197.           // Neuen Knoten erstellen.
  198.           ListNode newNode = new ListNode(pContent);
  199.  
  200.           first = newNode;
  201.           last = newNode;
  202.         }
  203.  
  204.       }
  205.     }
  206.   }
  207.  
  208.   /**
  209.    * Falls pContent gleich null ist, geschieht nichts.<br />
  210.    * Ansonsten wird ein neues Objekt pContent am Ende der Liste eingefuegt.
  211.    * Das aktuelle Objekt bleibt unveraendert. <br />
  212.    * Wenn die Liste leer ist, wird das Objekt pContent in die Liste eingefuegt
  213.    * und es gibt weiterhin kein aktuelles Objekt (hasAccess() == false).
  214.    *
  215.    * @param pContent
  216.    *            das anzuhaengende Objekt vom Typ ContentType
  217.    */
  218.   public void append(ContentType pContent) {
  219.     if (pContent != null) { // Nichts tun, wenn es keine Inhalt gibt.
  220.  
  221.       if (this.isEmpty()) { // Fall: An leere Liste anfuegen.
  222.         this.insert(pContent);
  223.       } else { // Fall: An nicht-leere Liste anfuegen.
  224.  
  225.         // Neuen Knoten erstellen.
  226.         ListNode newNode = new ListNode(pContent);
  227.  
  228.         last.setNextNode(newNode);
  229.         last = newNode; // Letzten Knoten aktualisieren.
  230.       }
  231.  
  232.     }
  233.   }
  234.  
  235.   /**
  236.    * Falls pList null oder eine leere Liste ist, geschieht nichts.<br />
  237.    * Ansonsten wird die Liste pList an die aktuelle Liste angehaengt.
  238.    * Anschliessend wird pList eine leere Liste. Das aktuelle Objekt bleibt
  239.    * unveraendert. Insbesondere bleibt hasAccess identisch.
  240.    *
  241.    * @param pList
  242.    *            die am Ende anzuhaengende Liste vom Typ List<ContentType>
  243.    */
  244.   public void concat(List<ContentType> pList) {
  245.     if (pList != null && !pList.isEmpty()) { // Nichts tun, wenn pList leer oder nicht existent.
  246.  
  247.       if (this.isEmpty()) { // Fall: An leere Liste anfuegen.
  248.         this.first = pList.first;
  249.         this.last = pList.last;
  250.       } else { // Fall: An nicht-leere Liste anfuegen.
  251.         this.last.setNextNode(pList.first);
  252.         this.last = pList.last;
  253.       }
  254.  
  255.       // Liste pList loeschen.
  256.       pList.first = null;
  257.       pList.last = null;
  258.       pList.current = null;
  259.     }
  260.   }
  261.  
  262.   /**
  263.    * Wenn die Liste leer ist oder es kein aktuelles Objekt gibt (hasAccess()
  264.    * == false), geschieht nichts.<br />
  265.    * Falls es ein aktuelles Objekt gibt (hasAccess() == true), wird das
  266.    * aktuelle Objekt geloescht und das Objekt hinter dem geloeschten Objekt
  267.    * wird zum aktuellen Objekt. <br />
  268.    * Wird das Objekt, das am Ende der Liste steht, geloescht, gibt es kein
  269.    * aktuelles Objekt mehr.
  270.    */
  271.   public void remove() {
  272.     // Nichts tun, wenn es kein aktuelle Element gibt oder die Liste leer ist.
  273.     if (this.hasAccess() && !this.isEmpty()) {
  274.  
  275.       if (current == first) {
  276.         first = first.getNextNode();
  277.       } else {
  278.         ListNode previous = this.getPrevious(current);
  279.         if (current == last) {
  280.           last = previous;
  281.         }
  282.         previous.setNextNode(current.getNextNode());
  283.       }
  284.  
  285.       ListNode temp = current.getNextNode();
  286.       current.setContentObject(null);
  287.       current.setNextNode(null);
  288.       current = temp;
  289.  
  290.       //Beim loeschen des letzten Elements last auf null setzen.
  291.       if (this.isEmpty()) {
  292.         last = null;
  293.       }
  294.     }
  295.   }
  296.  
  297.   /**
  298.    * Liefert den Vorgaengerknoten des Knotens pNode. Ist die Liste leer, pNode
  299.    * == null, pNode nicht in der Liste oder pNode der erste Knoten der Liste,
  300.    * wird null zurueckgegeben.
  301.    *
  302.    * @param pNode
  303.    *         der Knoten, dessen Vorgaenger zurueckgegeben werden soll
  304.    * @return der Vorgaenger des Knotens pNode oder null, falls die Liste leer ist,
  305.    *         pNode == null ist, pNode nicht in der Liste ist oder pNode der erste Knoten
  306.    *         der Liste ist
  307.    */
  308.   private ListNode getPrevious(ListNode pNode) {
  309.     if (pNode != null && pNode != first && !this.isEmpty()) {
  310.       ListNode temp = first;
  311.       while (temp != null && temp.getNextNode() != pNode) {
  312.         temp = temp.getNextNode();
  313.       }
  314.       return temp;
  315.     } else {
  316.       return null;
  317.     }
  318.   }
  319.  
  320. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement