From dd8649bcba4a38d5b0cc55cace15b68c0ce3ffa3 Mon Sep 17 00:00:00 2001 From: "elif.efe" Date: Wed, 22 Nov 2023 14:40:18 +0100 Subject: [PATCH] Elif.funktionen --- SparseVector.java | 220 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 219 insertions(+), 1 deletion(-) diff --git a/SparseVector.java b/SparseVector.java index 83f67b9..a9e0b6e 100644 --- a/SparseVector.java +++ b/SparseVector.java @@ -1,3 +1,221 @@ public class SparseVector { - + + private class Node { + int index; + double value; + Node next; + + public Node(int index, double value, Node next) { + this.index = index; + this.value = value; + this.next = next; + } + + } + + // Standard Konstruktor mit einem leeren Vektor initialisieren + private Node head = null; + private int length = 0; + + public SparseVector() { + this.head = null; + this.length = 0; + } + + + // Konstruktor mit Vektor länge n + public SparseVector (int n) { + this.head = null; + this.length = n; + } + + /* 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 + */ + public void setElement(int index, double value) { + + removeElement(index); + + if (this.head == null || this.head.index > index) { + this.head = new Node(index, value, this.head); + + } + //current = now + Node now = this.head; + + while (now.next != null && now.next.index < index) { + now = now.next; + } + +// gesuchte index gefunden + if (now != null && now.index == index) { + + now.value = value; + System.out.println("at index " + index + " set value " + value); + + } else if (now.next == null || now.next.index > index) { + now.next = new Node(index, value, now.next); + System.out.println("at index " + index + " set value " + value); + + } + + } + + + /* getElement: return the Wert value of that index + input das Index, und return den entsprechenden Wert des Index + */ + + public double getElement(int index) { + + if (index < 0 || index >= this.length) { // für Testfall wenn Länge < index + throw new IndexOutOfBoundsException("Index " + index + " ist außerhalb der Vektorlänge " + this.length + ". Max. Index ist " + (this.length-1)); + } + + Node now = this.head; + + while (now != null && now.index < index) { + + now = now.next; + } + + if (now != null && now.index == index) { + + double result = now.value; + + return result; + + } + + return 0.0; + + } + + + // entfernt Element nach Index + public void removeElement(int index) { + // previous = pre + Node now = this.head; + Node pre = null; + + if (now != null && now.index == index) { + this.head = now.next; + return; + + } + + while (now != null && now.index != index) { + + pre = now; + now = now.next; + + } + if (now != null && now.index == index) { + + pre.next = now.next; + // System.out.println("index " + index + " found and the value " + now.value + " deleted."); + + } else { + + // System.out.println("Element not found with index " + index); + + } + } + + + // Länge des Vektors ausgeben + + public int getLength() { + + int length = SparseVector.this.length; + + return length; + + } + + + // bool Methode equals: testen, ob other = this (nur vergleichen die Nicht-Null Elemente) + + public boolean equals(SparseVector other) { + + Node thisnow = this.head; + Node othernow = other.head; + + while (thisnow != null || othernow != null) { + + if (thisnow != null && othernow != null) { + if (!(thisnow.index == othernow.index && thisnow.value == othernow.value)) { + return false; + } + + thisnow = thisnow.next; + othernow = othernow.next; + + // wenn die Anzahl der Positionen mit Nicht-Null-Elementen nicht übereinstimmen = nicht identisch + + } else if ((thisnow != null && othernow == null) || (othernow != null && thisnow == null)) { + + return false; + } + + } + return true; + } + + // void add: to add two vectors together and renew (overwrite) the this.vector + + public void add(SparseVector other) { + + Node thisnow = this.head; + Node othernow = other.head; + Node thispre = null; + + // Fall 0: 2 Vektoren mit unterschiedlichen Längen geht nicht! + + if (this.getLength() != other.getLength()) { + + System.out.println("Vektoren mit unterschiedlichen Längen können nicht zusammen addiert werden!!"); + System.out.println("Länge des controlVector: " + this.getLength() + " aber die von otherVector: " + other.getLength()); + return; + + } + + while (thisnow != null && othernow != null) { + + // Fall 1, gleicher Index, dann nur Werte zusammen addieren → update this Vektor + if (thisnow.index == othernow.index ) { + thisnow.value += othernow.value; // overwrite the this. value + thispre = thisnow; + thisnow = thisnow.next; + othernow = othernow.next; + } + + // Fall 2: Der Index von othernow ist kleiner, füge diesen Knoten in this ein + else if (othernow.index < thisnow.index) { + + Node newNode = new Node(othernow.index, othernow.value, thisnow); + + if (thispre == null) { + this.head = newNode; + } else { + thispre.next = newNode; + } + + // this Vektor Zeiger und other Vektor Zeiger gehen weiter voran + othernow = othernow.next; + thispre = newNode; + + // Fall 3: Der Index von othernow > thisnow, 2 Zeiger gehen weiter + } else if (othernow.index > thisnow.index) { + + thispre = thisnow; + thisnow = thisnow.next; + + } + + } + + } } +