1   import java.util.ArrayList;
2   /** 
3    * 183.592 Programmierpraxis TU Wien WS2014/15 H.Moritsch
4    * Ein PersonNode ist ein Knoten in einer verketteten Liste. Er repräsentiert 
5    * einen einzelnen Personeneintrag. An einen Knoten kann ein weiterer Knoten 
6    * angehängt werden, wodurch eine Liste von PersonNode-Objekten entsteht. 
7    * Jeder Knoten ist der Startknoten der Liste, die aus "seinem" Personeneintrag
8    * und der Restliste (die über next referenziert wird), besteht. Der Startknoten 
9    * hat die Position (Index) 0.
10   */
11  public class PersonNode {
12  
13      Person person;
14      PersonNode next;
15  
16      /**
17       * Konstruktor: initialisiert diesen Knoten mit einer Person und der
18       * Referenz zum nächsten Knoten.
19       */
20      public PersonNode(Person person, PersonNode next) {
21          
22          this.person = person;
23          this.next = next;
24      }
25  
26      /**
27       * Gibt die Liste aus
28       */
29      public void showIterative() {
30          int i=0;
31          for (PersonNode pn = this; pn != null; pn = pn.next) {
32              System.out.println(i + " " + pn.person);
33              i++;
34          }
35      }
36  
37      /**
38       * Gibt die Liste aus (rekursiv, ohne Index)
39       */
40      public void show() {
41  
42          System.out.println(this.person);    // gib Person-Objekt dieses Knotens aus
43  
44          if (this.next != null)              // wenn dieser Knoten nicht der Endknoten ist,
45              this.next.show();               // gib Restliste aus
46      }
47  
48      /**
49       * Gibt die Liste aus (rekursiv, mit Index)
50       */
51      public void showWithIndex(int i) {
52  
53          System.out.println(i + " " + this.person);
54  
55          if (this.next != null)              
56              this.next.showWithIndex( i + 1 );   // Erhöhen des Index
57      }
58  
59      /**
60       * Anzahl der Studierenden 
61       */
62      public int numberOfStudents() {
63  
64          // s: 1 wenn Student, andernfalls 0
65          int s = this.person instanceof Student ? 1 : 0; 
66          
67          if (this.next == null)              // wenn dieser Knoten der Endknoten ist,
68              return s;                       // gib s zurück
69                  
70          // andernfalls gib die um s erhöhte Anzahl der Studierenden in der Restliste zurück
71          return s + this.next.numberOfStudents();
72      }
73  
74   
75      /**
76       * Liefert den Personeneintrag an einer bestimmten Position
77       */
78      public Person get(int index) {
79          
80          if (index == 0)                     // wenn dieser Knoten (Position 0) gefragt ist 
81              return this.person;             // gib diesen Knoten zurück
82          
83          return this.next.get( index-1 );    // andernfalls gib den Personeneintrag an der um 1 
84                                              // verminderten Position in der Restliste zurück
85      }
86     
87      /**
88       * Liefert die Position der ersten Person mit einem bestimmten Namen in der Liste
89       * Falls keine Person mit diesem Namen gefunden wird, wird -1 zurückgegeben.
90       */
91      public int indexOf(String name) {
92          
93          if (name.equals(this.person.getName())) // wenn der Name in diesem Knoten enthalten ist,
94              return 0;                           // gib als Position 0 zurück
95          
96  
97          // andernfalls (Name ist in diesem Knoten nicht enthalten):
98  
99          if (this.next == null)                  // wenn dieser Knoten der Endknoten ist,
100             return -1;                          // gib -1 zurück ("Name nicht enthalten")
101 
102         // andernfalls ( Name ist in diesem Knoten nicht enthalten UND 
103         // dieser Knoten ist nicht der Endknoten):
104 
105         int index = this.next.indexOf(name);    // ermittle die Position in der Restliste
106 
107         return index < 0 ? index : index + 1;   // in der Restliste nicht enthalten -> -1,
108                                     // andernfalls: um 1 erhöhte Position in der Restliste 
109     }
110  
111     /**
112      * Liefert eine Liste (ArrayList) mit den Matrikelnummern aller Studierenden 
113      */
114     public ArrayList<Integer> getMatnrList() {
115 
116         ArrayList<Integer> aList;               // ArrayList, die zurückgegeben wird
117 
118         if (this.next == null)                  // wenn dieser Knoten der Endknoten ist,
119             aList = new ArrayList<Integer>();   // erhalte eine neue leere ArrayList
120         else                                    // andernfalls:
121             aList = this.next.getMatnrList();   // erhalte ArrayList für die Restliste
122     
123         if (this.person instanceof Student) {   // wenn dieser Knoten einen Studierendeneintrag 
124             int matnr = ((Student) person).getMatnr();  // enthält:
125             aList.add(matnr);                           // füge Matrikelnummer an ArrayList an
126         }
127         return aList;
128     }
129            
130 }
131