| PersonNode.java |
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