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.

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