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.

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