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