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.

218 lines
6.8 KiB

1 year ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
1 year ago
  1. public class SparseVector {
  2. private class Node {
  3. int index;
  4. double value;
  5. Node next;
  6. public Node(int index, double value, Node next) {
  7. this.index = index;
  8. this.value = value;
  9. this.next = next;
  10. }
  11. }
  12. // Standard Konstruktor mit einem leeren Vektor initialisieren
  13. private Node head = null;
  14. private int length = 0;
  15. public SparseVector() {
  16. this.head = null;
  17. this.length = 0;
  18. }
  19. // Konstruktor mit Vektor länge n
  20. public SparseVector (int n) {
  21. this.head = null;
  22. this.length = n;
  23. }
  24. // die den Wert value an der Stelle index in den Vektor einfugt.
  25. /* den value in index hinzufügen
  26. - Aktualiiseren des Wertes, wenn der head an dem Index mit einem Wert exisitiert
  27. - Neuer head mit neuem Wert hinzufügen, wenn der head an dem Index nicht existiert
  28. */
  29. public void setElement(int index, double value) {
  30. removeElement(index);
  31. if (this.head == null || this.head.index > index) {
  32. this.head = new Node(index, value, this.head);
  33. }
  34. //current = now
  35. Node now = this.head;
  36. while (now.next != null && now.next.index < index) {
  37. now = now.next;
  38. }
  39. // gesuchte index gefunden
  40. if (now != null && now.index == index) {
  41. now.value = value;
  42. System.out.println("at index " + index + " set value " + value);
  43. } else if (now.next == null || now.next.index > index) {
  44. now.next = new Node(index, value, now.next);
  45. System.out.println("at index " + index + " set value " + value);
  46. }
  47. }
  48. // Eine Methode double getElement(int index) das den Wert des durch index definierten Eintrags wiedergibt (oder 0.0, falls der Eintrag an dieser Stelle nicht existiert).
  49. /* getElement: return the Wert value of that index
  50. input das Index, und return den entsprechenden Wert des Index
  51. */
  52. public double getElement(int index) {
  53. if (index < 0 || index >= this.length) { // für Testfall wenn Länge < index
  54. throw new IndexOutOfBoundsException("Index " + index + " ist außerhalb der Vektorlänge " + this.length + ". Max. Index ist " + (this.length-1));
  55. }
  56. Node now = this.head;
  57. while (now != null && now.index < index) {
  58. now = now.next;
  59. }
  60. if (now != null && now.index == index) {
  61. double result = now.value;
  62. return result;
  63. }
  64. return 0.0;
  65. }
  66. // entfernt Element nach Index
  67. public void removeElement(int index) {
  68. // previous = pre
  69. Node now = this.head;
  70. Node pre = null;
  71. if (now != null && now.index == index) {
  72. this.head = now.next;
  73. return;
  74. }
  75. while (now != null && now.index != index) {
  76. pre = now;
  77. now = now.next;
  78. }
  79. if (now != null && now.index == index) {
  80. pre.next = now.next;
  81. System.out.println("index " + index + " found and the value " + now.value + " deleted.");
  82. } else {
  83. System.out.println("Element not found with index " + index);
  84. }
  85. }
  86. // Länge des Vektors ausgeben
  87. public int getLength() {
  88. int length = SparseVector.this.length;
  89. return length;
  90. }
  91. // die testet, ob der übergebene SparseVector other mit der aktuellen Instanz identisch ist.
  92. // testen, ob other = this (nur vergleichen die Nicht-Null Elemente)
  93. public boolean equals(SparseVector other) {
  94. Node thisnow = this.head;
  95. Node othernow = other.head;
  96. while (thisnow != null || othernow != null) {
  97. if (thisnow != null && othernow != null) {
  98. if (!(thisnow.index == othernow.index && thisnow.value == othernow.value)) {
  99. return false;
  100. }
  101. thisnow = thisnow.next;
  102. othernow = othernow.next;
  103. // wenn die Anzahl der Positionen mit Nicht-Null-Elementen nicht übereinstimmen = nicht identisch
  104. } else if ((thisnow != null && othernow == null) || (othernow != null && thisnow == null)) {
  105. return false;
  106. }
  107. }
  108. return true;
  109. }
  110. // die alle Einträge aus dem Vektor other auf die aktuelle Repräsentation addiert
  111. public void add(SparseVector other) {
  112. Node thisnow = this.head;
  113. Node othernow = other.head;
  114. Node thispre = null;
  115. // Fall 0: 2 Vektoren mit unterschiedlichen Längen geht nicht!
  116. if (this.getLength() != other.getLength()) {
  117. System.out.println("Vektoren mit unterschiedlichen Längen können nicht zusammen addiert werden!!");
  118. System.out.println("Länge des controlVector: " + this.getLength() + " aber die von otherVector: " + other.getLength());
  119. return;
  120. }
  121. while (thisnow != null && othernow != null) {
  122. // Fall 1, gleicher Index, dann nur Werte zusammen addieren → update this Vektor
  123. if (thisnow.index == othernow.index ) {
  124. thisnow.value += othernow.value; // overwrite the this. value
  125. thispre = thisnow;
  126. thisnow = thisnow.next;
  127. othernow = othernow.next;
  128. }
  129. // Fall 2: Der Index von othernow ist kleiner, füge diesen Knoten in this ein
  130. else if (othernow.index < thisnow.index) {
  131. Node newNode = new Node(othernow.index, othernow.value, thisnow);
  132. if (thispre == null) {
  133. this.head = newNode;
  134. } else {
  135. thispre.next = newNode;
  136. }
  137. // this Vektor Zeiger und other Vektor Zeiger gehen weiter voran
  138. othernow = othernow.next;
  139. thispre = newNode;
  140. // Fall 3: Der Index von othernow > thisnow, 2 Zeiger gehen weiter
  141. } else if (othernow.index > thisnow.index) {
  142. thispre = thisnow;
  143. thisnow = thisnow.next;
  144. }
  145. }
  146. }
  147. }