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.

200 lines
5.8 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. now = now.next;
  54. }
  55. if (now != null && now.index == index) {
  56. double result = now.value;
  57. return result;
  58. }
  59. return 0.0;
  60. }
  61. //Leonhard: entfernt Element nach Index
  62. public void removeElement(int index) {
  63. // previous = pre
  64. Node now = this.head;
  65. Node pre = null;
  66. if (now != null && now.index == index) {
  67. this.head = now.next;
  68. return;
  69. }
  70. while (now != null && now.index != index) {
  71. pre = now;
  72. now = now.next;
  73. }
  74. if (now != null && now.index == index) {
  75. pre.next = now.next;
  76. // System.out.println("index " + index + " found and the value " + now.value + "
  77. // deleted.");
  78. } else {
  79. // System.out.println("Element not found with index " + index);
  80. }
  81. }
  82. //Leonhard: Länge des Vektors ausgeben
  83. public int getLength() {
  84. int length = SparseVector.this.length;
  85. return length;
  86. }
  87. //Terry: bool Methode equals: testen, ob other = this (nur vergleichen die Nicht-Null Elemente)
  88. public boolean equals(SparseVector other) {
  89. Node thisnow = this.head;
  90. Node othernow = other.head;
  91. while (thisnow != null || othernow != null) {
  92. if (thisnow != null && othernow != null) {
  93. if (!(thisnow.index == othernow.index && thisnow.value == othernow.value)) {
  94. return false;
  95. }
  96. thisnow = thisnow.next;
  97. othernow = othernow.next;
  98. // wenn die Anzahl der Positionen mit Nicht-Null-Elementen nicht übereinstimmen
  99. // = nicht identisch
  100. } else if ((thisnow != null && othernow == null) || (othernow != null && thisnow == null)) {
  101. return false;
  102. }
  103. }
  104. return true;
  105. }
  106. // Terry: void add: to add two vectors together and renew (overwrite) the this.vector
  107. public void add(SparseVector other) {
  108. Node thisnow = this.head;
  109. Node othernow = other.head;
  110. Node thispre = null;
  111. // Fall 0: 2 Vektoren mit unterschiedlichen Längen geht nicht!
  112. if (this.getLength() != other.getLength()) {
  113. System.out.println("Vektoren mit unterschiedlichen Längen können nicht zusammen addiert werden!!");
  114. System.out.println(
  115. "Länge des controlVector: " + this.getLength() + " aber die von otherVector: " + other.getLength());
  116. return;
  117. }
  118. while (thisnow != null && othernow != null) {
  119. // Fall 1, gleicher Index, dann nur Werte zusammen addieren → update this Vektor
  120. if (thisnow.index == othernow.index) {
  121. thisnow.value += othernow.value; // overwrite the this. value
  122. thispre = thisnow;
  123. thisnow = thisnow.next;
  124. othernow = othernow.next;
  125. }
  126. // Fall 2: Der Index von othernow ist kleiner, füge diesen Knoten in this ein
  127. else if (othernow.index < thisnow.index) {
  128. Node newNode = new Node(othernow.index, othernow.value, thisnow);
  129. if (thispre == null) {
  130. this.head = newNode;
  131. } else {
  132. thispre.next = newNode;
  133. }
  134. // this Vektor Zeiger und other Vektor Zeiger gehen weiter voran
  135. othernow = othernow.next;
  136. thispre = newNode;
  137. // Fall 3: Der Index von othernow > thisnow, 2 Zeiger gehen weiter
  138. } else if (othernow.index > thisnow.index) {
  139. thispre = thisnow;
  140. thisnow = thisnow.next;
  141. }
  142. }
  143. }
  144. }