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.

210 lines
6.1 KiB

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