You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

264 lines
7.5 KiB

1 year ago
1 year ago
  1. /**
  2. * Sparse Implementierung einer verkettete Liste
  3. */
  4. public class SparseVector {
  5. /**
  6. * Hilfsklasse, welche ein einzelnes Node repräsentiert.
  7. *
  8. * @author Paul
  9. */
  10. private class Node {
  11. int index;
  12. double value;
  13. Node next;
  14. public Node(int index, double value, Node next) {
  15. this.index = index;
  16. this.value = value;
  17. this.next = next;
  18. }
  19. }
  20. // Elif: Standard Konstruktor mit einem leeren Vektor initialisieren
  21. private Node head = null;
  22. private int length = 0;
  23. /**
  24. * Konstruktor mit Vektor länge 0
  25. *
  26. * @author Elif
  27. */
  28. public SparseVector() {
  29. this.head = null;
  30. this.length = 0;
  31. }
  32. /**
  33. * Konstruktor mit Vektor länge n
  34. *
  35. * @author Elif
  36. * @param n Vektor länge
  37. */
  38. public SparseVector(int n) {
  39. this.head = null;
  40. this.length = n;
  41. }
  42. /**
  43. * den value in index hinzufügen - Aktualiiseren des Wertes, wenn der head an
  44. * dem Index mit einem Wert exisitiert - Neuer head mit neuem Wert hinzufügen,
  45. * wenn der head an dem Index nicht existiert
  46. *
  47. * @author Elif
  48. * @param index Index des zu setzenden Wertes
  49. * @param value Wert, welcher eingesetzt werden soll
  50. */
  51. public void setElement(int index, double value) {
  52. removeElement(index);
  53. int maxIndex = this.getLength() - 1;
  54. if (index > maxIndex) {
  55. System.out.println("Fehler: Der Index " + index + " ist außerhalb des erlaubten Bereichs.");
  56. return;
  57. }
  58. if (this.head == null || this.head.index > index) {
  59. this.head = new Node(index, value, this.head);
  60. }
  61. // current = now
  62. Node now = this.head;
  63. while (now.next != null && now.next.index < index) {
  64. now = now.next;
  65. }
  66. // gesuchte index gefunden
  67. if (now != null && now.index == index) {
  68. now.value = value;
  69. System.out.println("at index " + index + " set value " + value);
  70. } else if (now.next == null || now.next.index > index) {
  71. now.next = new Node(index, value, now.next);
  72. System.out.println("at index " + index + " set value " + value);
  73. }
  74. }
  75. /**
  76. * return the Wert value of that index input das Index, und return den
  77. * entsprechenden Wert des Index
  78. *
  79. * @author Paul
  80. * @param index Stelle, an der der Wert steht
  81. * @return double Wert des Elements
  82. */
  83. public double getElement(int index) {
  84. if (index < 0 || index >= this.length) { // für Testfall wenn Länge < index
  85. throw new IndexOutOfBoundsException("Index " + index + " ist außerhalb der Vektorlänge " + this.length
  86. + ". Max. Index ist " + (this.length - 1));
  87. }
  88. Node now = this.head;
  89. while (now != null) {
  90. if (now.index == index) {
  91. return now.value;
  92. }
  93. now = now.next;
  94. }
  95. return 0.0;
  96. }
  97. /**
  98. * entfernt Element nach Index
  99. *
  100. * @author Leonhard
  101. * @param index Stelle des zu entferneden Elements
  102. */
  103. public void removeElement(int index) {
  104. // Anlegen der jetzigen und vorherigen Node
  105. Node now = this.head;
  106. Node pre = null;
  107. // Wenn der momentane Node nicht Null ist und der gesuchte Index korrekt ist
  108. // ersetze den momentanen Node durch den nächsten
  109. if (now != null && now.index == index) {
  110. this.head = now.next;
  111. return;
  112. }
  113. // Während wir momentan nicht bei Null sind und den Index nicht gefunden haben
  114. // setzte pre und now den nächsten Node weiter
  115. while (now != null && now.index != index) {
  116. pre = now;
  117. now = now.next;
  118. }
  119. // Wenn wir den Index gefunden haben und nicht bei Null sind
  120. // setze den nächsten Node auf den momentanen Node
  121. if (now != null && now.index == index) {
  122. pre.next = now.next;
  123. System.out.println("Node mit Wert: " + now.value + " am Index " + index + " gefunden und gelöscht.");
  124. } else {
  125. System.out.println("Keine Node am Index: " + index + " nicht gefunden!");
  126. }
  127. }
  128. /**
  129. * Länge des Vektors ausgeben
  130. *
  131. * @author Leonhard
  132. * @return int [Beschreibung]
  133. */
  134. public int getLength() {
  135. return SparseVector.this.length;
  136. }
  137. /**
  138. * testen, ob other = this (nur vergleichen die Nicht-Null Elemente)
  139. *
  140. * @author YC Terry
  141. * @param other Anderer Vektor, mit dem verglichen wird
  142. * @return boolean Wahrheitswert, ob Vektoren gleich sind
  143. */
  144. public boolean equals(SparseVector other) {
  145. if (this.getLength() != other.getLength()) {
  146. return false;
  147. }
  148. Node thisnow = this.head;
  149. Node othernow = other.head;
  150. while (thisnow != null || othernow != null) {
  151. if (thisnow != null && othernow != null) {
  152. if (!(thisnow.index == othernow.index && thisnow.value == othernow.value)) {
  153. return false;
  154. }
  155. thisnow = thisnow.next;
  156. othernow = othernow.next;
  157. // wenn die Anzahl der Positionen mit Nicht-Null-Elementen nicht übereinstimmen
  158. // = nicht identisch
  159. } else if ((thisnow != null && othernow == null) || (othernow != null && thisnow == null)) {
  160. return false;
  161. }
  162. }
  163. return true;
  164. }
  165. /**
  166. * to add two vectors together and renew (overwrite) the this.vector
  167. *
  168. * @author YC Terry
  169. * @param other Anderer Vektor, der auf addiert wird
  170. */
  171. public void add(SparseVector other) {
  172. Node thisnow = this.head;
  173. Node othernow = other.head;
  174. Node thispre = null;
  175. // Fall 0: 2 Vektoren mit unterschiedlichen Längen geht nicht!
  176. if (this.getLength() != other.getLength()) {
  177. System.out.println("Vektoren mit unterschiedlichen Längen können nicht zusammen addiert werden!!");
  178. System.out.println(
  179. "Länge des controlVector: " + this.getLength() + " aber die von otherVector: " + other.getLength());
  180. return;
  181. }
  182. while (thisnow != null && othernow != null) {
  183. // Fall 1, gleicher Index, dann nur Werte zusammen addieren → update this Vektor
  184. if (thisnow.index == othernow.index) {
  185. thisnow.value += othernow.value; // overwrite the this. value
  186. thispre = thisnow;
  187. thisnow = thisnow.next;
  188. othernow = othernow.next;
  189. }
  190. // Fall 2: Der Index von othernow ist kleiner, füge diesen Knoten in this ein
  191. else if (othernow.index < thisnow.index) {
  192. Node newNode = new Node(othernow.index, othernow.value, thisnow);
  193. if (thispre == null) {
  194. this.head = newNode;
  195. } else {
  196. thispre.next = newNode;
  197. }
  198. // this Vektor Zeiger und other Vektor Zeiger gehen weiter voran
  199. othernow = othernow.next;
  200. thispre = newNode;
  201. // Fall 3: Der Index von othernow > thisnow, 2 Zeiger gehen weiter
  202. } else if (othernow.index > thisnow.index) {
  203. thispre = thisnow;
  204. thisnow = thisnow.next;
  205. }
  206. }
  207. }
  208. }