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.

227 lines
7.5 KiB

  1. public class SparseVector {
  2. // Hilfsklasse Node
  3. private class Node {
  4. int index;
  5. double value;
  6. Node next;
  7. public Node(int index, double value, Node next) {
  8. this.index = index;
  9. this.value = value;
  10. this.next = next;
  11. }
  12. }
  13. // Standard Konstruktor: leeren Vektor initialisieren
  14. private Node head = null;
  15. private int length = 0;
  16. public SparseVector() {
  17. this.head = null;
  18. this.length = 0;
  19. }
  20. // Konstruktor: erzeugen Vektor mit Lange n
  21. public SparseVector (int n) {
  22. this.head = null;
  23. this.length = n;
  24. }
  25. /* setElement(int index, double value): add value into each index
  26. (case1: wenn der Knoten an dem Index mit einem Wert existiert, den Wert aktualisieren)
  27. (case2: wenn der Knoten an dem Index noch nicht existiert, ein neuer Knoten mit neuem Wert hinzüfugen)
  28. */
  29. public void setElement(int index, double value) { //z.B. wenn ich zu index (6) einen value (1) einfüge,
  30. removeElement(index);
  31. if (this.head == null || this.head.index > index) {
  32. // aber entweder Element nicht existiert oder das erste Element ist > 6 (Start: index 7)
  33. this.head = new Node(index, value, this.head); // erzeugen eines neuen Kopfs
  34. }
  35. Node current = this.head;
  36. while (current.next != null && current.next.index < index) { // Zeiger bewegt sich durch den Vektor, solange der gesuchte Index noch nicht erreicht wird
  37. current = current.next;
  38. }
  39. if (current != null && current.index == index) { // und der gesuchte Index erreicht wird
  40. current.value = value;
  41. System.out.println("at index " + index + " set value " + value);
  42. } else if (current.next == null || current.next.index > index) { // zum Beispiel, wenn Zeiger am Ende ankommt, ohne den gesuchten Index
  43. // oder next index ist 7 und ich brauche index 6, einfügen das Element index 6 vor index 7
  44. current.next = new Node(index, value, current.next); // siehe ipad Testat1 setElement
  45. System.out.println("at index " + index + " set value " + value);
  46. }
  47. }
  48. /* getElement: return the Wert value of that index
  49. input das Index, und return den entsprechenden Wert des Index
  50. */
  51. public double getElement(int index) {
  52. if (index < 0 || index >= this.length) { // für Testfall wenn Länge < index
  53. throw new IndexOutOfBoundsException("Index " + index + " ist außerhalb der Vektorlänge " + this.length + ". Max. Index ist " + (this.length-1));
  54. }
  55. Node current = this.head;
  56. while (current != null && current.index < index) {
  57. current = current.next;
  58. }
  59. if (current != null && current.index == index) {
  60. double result = current.value;
  61. return result;
  62. }
  63. return 0.0;
  64. }
  65. // removeElement: remove the whole element per index
  66. public void removeElement(int index) { // siehe ipad Testat1 removeElement
  67. Node current = this.head;
  68. Node previous = null;
  69. if (current != null && current.index == index) {
  70. this.head = current.next;
  71. System.out.println(index + " found and deleted");
  72. return;
  73. }
  74. while (current != null && current.index != index) {
  75. previous = current;
  76. current = current.next;
  77. }
  78. if (current != null && current.index == index) {
  79. previous.next = current.next;
  80. System.out.println("index " + index + " found and the value " + current.value + " deleted.");
  81. } else {
  82. System.out.println("Element not found with index " + index);
  83. }
  84. }
  85. // getLength: return the length (max. capacity) of Vektor
  86. public int getLength() {
  87. int length = SparseVector.this.length;
  88. return length;
  89. }
  90. // bool Methode equals: testen, ob other = this (nur vergleichen die Nicht-Null Elemente)
  91. public boolean equals(SparseVector other) {
  92. Node thisCurrent = this.head;
  93. Node otherCurrent = other.head;
  94. while (thisCurrent != null || otherCurrent != null) {
  95. if (thisCurrent != null && otherCurrent != null) {
  96. if (!(thisCurrent.index == otherCurrent.index && thisCurrent.value == otherCurrent.value)) {
  97. return false;
  98. }
  99. thisCurrent = thisCurrent.next;
  100. otherCurrent = otherCurrent.next;
  101. // wenn die Anzahl der Positionen mit Nicht-Null-Elementen nicht übereinstimmen = nicht identisch
  102. } else if ((thisCurrent != null && otherCurrent == null) || (otherCurrent != null && thisCurrent == null)) {
  103. return false;
  104. }
  105. }
  106. return true;
  107. }
  108. // void add: to add two vectors together and renew (overwrite) the this.vector
  109. public void add(SparseVector other) {
  110. Node thisCurrent = this.head;
  111. Node otherCurrent = other.head;
  112. Node thisPrevious = null;
  113. // Fall 0: 2 Vektoren mit unterschiedlichen Längen geht nicht!
  114. if (this.getLength() != other.getLength()) {
  115. System.out.println("Vektoren mit unterschiedlichen Längen können nicht zusammen addiert werden!!");
  116. System.out.println("Länge des controlVector: " + this.getLength() + " aber die von otherVector: " + other.getLength());
  117. return;
  118. }
  119. while (thisCurrent != null && otherCurrent != null) {
  120. // Fall 1, gleicher Index, dann nur Werte zusammen addieren → update this Vektor
  121. if (thisCurrent.index == otherCurrent.index ) {
  122. thisCurrent.value += otherCurrent.value; // overwrite the this. value
  123. thisPrevious = thisCurrent;
  124. thisCurrent = thisCurrent.next;
  125. otherCurrent = otherCurrent.next;
  126. }
  127. // Fall 2: Der Index von otherCurrent ist kleiner, füge diesen Knoten in this ein
  128. else if (otherCurrent.index < thisCurrent.index) {
  129. Node newNode = new Node(otherCurrent.index, otherCurrent.value, thisCurrent);
  130. if (thisPrevious == null) {
  131. this.head = newNode;
  132. } else {
  133. thisPrevious.next = newNode;
  134. }
  135. // this Vektor Zeiger und other Vektor Zeiger gehen weiter voran
  136. otherCurrent = otherCurrent.next;
  137. thisPrevious = newNode;
  138. // Fall 3: Der Index von otherCurrent > thisCurrent, 2 Zeiger gehen weiter
  139. } else if (otherCurrent.index > thisCurrent.index) {
  140. thisPrevious = thisCurrent;
  141. thisCurrent = thisCurrent.next;
  142. }
  143. }
  144. }
  145. }