Variablen Eine Variable mit 2 Typen

BadBat

Aktives Mitglied
Moin moin,
Ich habe folgendes Problem wo mir einfach keine Lösung einfällt. Ich muss für die Uni mehrere Algorithmen in 2 Programiersprachen umsetzten. Die Algorithmen habe ich fertig und die erste Sprache abgearbeitet. Nun fehlt mir noch java. Der Prof hat folgende Spezifikation gegeben.
Code (Java):
public class ListenElement {

private Typ data;
private ListenElement next;

public ListenElement is_a_list() {

}
...
...}

Also eine Liste soll sowohl weitere Listen als auch nummer enthalten können.
Zum beispiel [0,2,4,[2,3],6,7]. In next soll das erste Element der Liste gespeichert werden, aber das kann ja eine Liste oder ein int sein. In Ruby wäre es z.B. kein Problem da kann ja alles in ein Array aber hier weiß ich nicht wie ich rangehen soll wegen der Typisierung :( . Falls irgendjemand ansatzweise versteht was ich hier für wirres zeug rede und mir vielleicht einen Tipp geben könnte wie ich ranzugehen habe wäre ich super dankbar.
 

stg

Top Contributor
Falls irgendjemand ansatzweise versteht was ich hier für wirres zeug rede

Nicht wirklich. Poste doch mal die exakte Aufgabenstellung. Was du schilderst hört sich nach dem Composite Pattern an. Der Code-Schnipsel, den du gepostet hast, sieht dem Ansatz nach nach einer verketteten Liste aus. so wie er da steht, ist der Code aber noch recht sinnfrei und nicht einmal kompilierbar, daher kann man nur raten.
 

Tobse

Top Contributor
Diese Herangehensweise ist auch nicht sehr typisch für Java, aus genau dem Problem, das du beschreibst.

Es ist in Java nicht möglich, eine Variable mit zwei Typen zu haben. Du hast daher zwei möglichkeiten:

1. Du nimmst Object. Dann musst du selbst prüfen, ob ein Element nun ein Integer oder eine List ist.

2. Du baust dir eine Klasse, welche einen int, eine Liste und die information, was von beidem relevant ist, beinhaltet:
Java:
class ListItem {
    private int integer;
    private List<ListItem> list;
    private boolean isList;
}
 

BadBat

Aktives Mitglied
Also dies ist die genaue Aufgabenstellung

"As the bread and butter of functional programming, lists deserve some serious attention." - Real World Haskell

Da dieses Zitat ebenso für Prolog gilt, implementieren Sie bitte die nachfolgenden Listenoperationen. Erarbeiten Sie zunächst dafür Lösungsstrategien, die sich an der Aufgabe orientiert und nicht an der Zielsprache.
  1. is_a_list(L), testet, ob L eine Prolog-Liste ist
  2. diffList(L1, L2, L3), bildet aus L1 und L2 die Differenzenliste L3
  3. infix(I, L), testet, ob I (ist eine Liste!) ein Infix der Liste L ist (vor und nach einem Infix ist noch etwas!)
  4. suffix(S, L), testet, ob S (ist eine Liste!) ein Suffix der Liste L ist (vor einem Suffix ist noch etwas!)
  5. praefix(P, L), testet, ob P (ist eine Liste!) ein Präfix Liste L ist (nach einem Prefix ist noch etwas!)
  6. eo_count(L, Even, Odd), zählt rekursiv die Anzahl der in der Länge geraden bzw. ungeraden Listen in der Liste L inklusive dieser Listen selbst, also alle möglichen Listen! Eine leere Liste wird als Liste mit gerader Länge angesehen. In der Liste können Elemente vorkommen, die keine Liste sind.
  7. del_element(P, E, L, R), löscht E aus der Liste L an Position P und gibt die neue Liste R zurück. P bezeichnet die Position: e erstes, l letztes, a alle Vorkommen
  8. substitute(P, E1,E2,L,R), vertauscht ein Vorkommen von E1 an der Position P in L gegen E2 und gibt das Ergebnis in R zurück. P bezeichnet die Position: e erstes, l letztes, a alle Vorkommen
Es sei folgende Spezifikation in Java gegeben:
public class ListenElement {

private Typ data;
private ListenElement next;

public ListenElement is_a_list() {
...
}

...}

Implementieren Sie nun die oben entwickelten Lösungsstrategien in Java. Prolog-Code und Java-Code müssen exakt der gleichen Strategie folgen!
 

JCODA

Top Contributor
Die Javaklasse repräsentiert eine einfache >einfach-verkettete< Liste. Deine Interpretation davon war leider falsch.

Die Frage ist mMn eher, warum is_a_list() ein ListenElement zurück gibt. Hängt wohl irgendwie mit der von Prolog-verwendeten Strategie zusammen.
 

BadBat

Aktives Mitglied
Die Javaklasse repräsentiert eine einfache >einfach-verkettete< Liste. Deine Interpretation davon war leider falsch.
Ja aber das es eine einfach verkettete Liste ist hilft mir ja nicht bei der Typisierung o_O oder?. In wie fern war meine Interpretation falsch?

Die Frage ist mMn eher, warum is_a_list() ein ListenElement zurück gibt. Hängt wohl irgendwie mit der von Prolog-verwendeten Strategie zusammen.

Hehe ja macht auch überhaupt keinen sinn ^^ bei ner Boolean abfrage ne Liste zurück zu geben. Da bin ich aber noch garnicht drüber gestolpert.

Ich habe mich jetzt dafür entschieden einfach alles als Element meiner Klasse zu behandeln... ist meiner Meinung nach zwar etwas sinnfrei, da ich jedes Element was ich der Liste hinzufügen will erstmal erzeugen muss aber mir fällt immomnet nichts besseres ein :S
Java:
public class ListenElement {

    private List<ListenElement> list;
    private char charakter;
    private int number;
    boolean isList;
 
    private ListenElement next;
 
    /**
     * Erzeugt ein Listen Element(int)
     *
     * @param element / Integer
     */
    public ListenElement(int element) {
        isList = false;
        number = element;
    }
 
    /**
     * Erzeugt ein Listen Element(char)
     *
     * @param element / Char
     */
    public ListenElement(char element) {
        isList = false;
        charakter = element;
    }

    /**
     * Default Constructor
     *
     * Erzeugt eine leere Liste
     *
     */
    public ListenElement() {
        isList = true;     
    }
 
    public ListenElement addItem(ListenElement element){
        if(isList){
            list.add(element);
        }else{
            System.out.println("Nur Listen kann etwas hinzugefügt werden");
        }
        return this;
    }
 

BadBat

Aktives Mitglied
Wieso änderst du die Klasse? Diese ist ja in der Aufgabenstellung gegeben...
Hilfreich xD... ich kann die Aufgabenstellung schon lesen und sehe auch das die Klasse da so nicht gegeben ist... hast du eine Idee wie ich es mit der gestellten Klasse realisieren kann? Dann bitte. ich bin dankbar für jede hilfe
 

thecain

Top Contributor
Als LinkedList implementierung

Typ ist das data element. welches irgendwas sein kann. Wahrscheinlich ein Generic T irgendwann.
next zeigt auf das nächste ListElement.

Wenn nur eines da ist, ist es noch keine Liste.
 

BadBat

Aktives Mitglied
Ah ich glaube jetzt hab ich gerallt :p in next verlinke ich mein nächstes objekt meiner klasse und habe so eine Liste. Das war sehr hilfreich :)
 

BadBat

Aktives Mitglied
Als LinkedList implementierung

Typ ist das data element. welches irgendwas sein kann. Wahrscheinlich ein Generic T irgendwann.
next zeigt auf das nächste ListElement.

Wenn nur eines da ist, ist es noch keine Liste.

Objekt 1 (next = objekt 2) , Objekt 2(next = objekt 3) usw..
Aber sind damit überhaupt geschachtelte Listen möglich [1,2,3,[4,5],6,7]?
 

thecain

Top Contributor
Nein, aber das ist meiner Interpretation nach auch nicht in der Aufgabenstellung.

Infix soll mMn nur prüfen ob Liste B in Liste A enthalten ist.
 

BadBat

Aktives Mitglied
Nein, aber das ist meiner Interpretation nach auch nicht in der Aufgabenstellung.

Infix soll mMn nur prüfen ob Liste B in Liste A enthalten ist.
Ja doch in Aufgabe 6 soll ich geschachtelte Listen zählen ob sie eine grade oder ungrade anzahl an Elementen haben. :S Aber auf jeden fall schonmal vielen dank für die hilfe
 

thecain

Top Contributor
Was man könnte, wäre das Data Attribut als Liste zu verwenden, dann wäre Typ vom Type ListElement.

Die Aufgabe widerspricht jedoch vielen Ansätzen einer statisch typisierten Sprache, wenn sie so gestellt ist. Jedenfalls wenn die Listen noch andere Attribute als Attribute vom Type ListElement haben sollen.
 

CSHW89

Bekanntes Mitglied
@mrBrown: klar, so werden bspw. in Lisp und ich meine auch in Prolog (was in dieser Aufgabe ja auch relevant ist), alle Daten intern gespeichert.
Zur Spezifikation: meiner Meinung nach kann sie so, wie sie da steht nicht korrekt sein. Entweder muss die Klasse ListenElement von der Klasse Typ erben, oder das Attribut 'private Typ data' muss vom Typ Object sein.
 

mrBrown

Super-Moderator
Mitarbeiter
@mrBrown: klar, so werden bspw. in Lisp und ich meine auch in Prolog (was in dieser Aufgabe ja auch relevant ist), alle Daten intern gespeichert.
Zur Spezifikation: meiner Meinung nach kann sie so, wie sie da steht nicht korrekt sein. Entweder muss die Klasse ListenElement von der Klasse Typ erben, oder das Attribut 'private Typ data' muss vom Typ Object sein.

Spätestens die typische Objektorientierte Version entspricht nicht mehr dem GoF-Pattern.
Und in Lisp würd ich das erstmal auch anzweifeln, man hat schließlich keine Unterteilung durch den Typ, sondern ein Element hat immer Inhalt und Restliste. Man kann auch weder den Platz der Restliste mit Inhalt füllen, noch den Inhalt mit der Restliste, eben weil es durch die Struktur der Daten vorgegeben ist - es gibt kein Inhalt oder Restliste, sondern immer beides.
 

CSHW89

Bekanntes Mitglied
@mrBrown: Ja richtig, ein Element in Lisp hat immer Inhalt und Restliste, wobei der Inhalt z.b. eine Zahl sein kann, aber eben auch wieder eine Liste. Und so wie die Spezifikation aussieht, würde ich behaupten, genau sowas soll man da programmieren. Ein ListenElement hat zwei Attribute 'data' (Inhalt) und 'next' (Restliste).
@thecain: Damit wären aber verschachtelte Listen nicht möglich, was aber wohl gefordert ist.
 

mrBrown

Super-Moderator
Mitarbeiter
@mrBrown: Ja richtig, ein Element in Lisp hat immer Inhalt und Restliste, wobei der Inhalt z.b. eine Zahl sein kann, aber eben auch wieder eine Liste. Und so wie die Spezifikation aussieht, würde ich behaupten, genau sowas soll man da programmieren. Ein ListenElement hat zwei Attribute 'data' (Inhalt) und 'next' (Restliste).
Und das ist wie gesagt dann nicht mehr das Composite-Pattern ;)

@thecain: Damit wären aber verschachtelte Listen nicht möglich, was aber wohl gefordert ist.
Natürlich, damit wäre zB ListElement<ListElement<Integer>> möglich.

Die Aufgabe ist aber mMn ziemlich sinnfrei, in schwach und dynamisch typisierte muss man das halt anders machen als in stark und statisch typisierten...
 

CSHW89

Bekanntes Mitglied
Und das ist wie gesagt dann nicht mehr das Composite-Pattern ;)
Nun ja, wenn man einschränkt, dass ein Kompositum immer 1-2 Kinder besitzt, wovon das erste entweder ein Blatt oder ein Kompositum ist, und das eventuelle zweite immer ein Kompositum, dann schon. Streng genommen, hast du aber recht ^^.
Natürlich, damit wäre zB ListElement<ListElement<Integer>> möglich.
Ähm ja natürlich.
Die Aufgabe ist aber mMn ziemlich sinnfrei, in schwach und dynamisch typisierte muss man das halt anders machen als in stark und statisch typisierten...
In der Tat.
 

mrBrown

Super-Moderator
Mitarbeiter
Nun ja, wenn man einschränkt, dass ein Kompositum immer 1-2 Kinder besitzt, wovon das erste entweder ein Blatt oder ein Kompositum ist, und das eventuelle zweite immer ein Kompositum, dann schon. Streng genommen, hast du aber recht ^^.
Nun ja, mit der Begründung ist auch ein Array ein Kompositum, da kann schließlich auch entweder ein Blatt (=irgendwas anderes) oder ein Array drin liegen^^
 

DefconDev

Bekanntes Mitglied
Welche Praxisrelevanz hat eine solche Aufgabenstellung, mal in die Runde geworfen?

Die Aufgabe liest sich so, sie haben einen Hammer und eine Axt, fällen sie den Baum auf die gleiche Weise!

In Python wäre das ebenso ein leichtes... in Java eine Vergewaltigung.
 

andy82

Mitglied
Hier wäre eine Lösung:
Java:
import java.util.ArrayList;

public class ListenElement{
    ArrayList<Object> arraylist;    //interne Speicher
    public ListenElement(){
        arraylist = new ArrayList<>();    //ini. Speichern
    }
/*
Eventuell noch addElement(int index, int i) und
addElement(int index, ListenElement listenElement) erweitern!
*/
    public boolean addElement(int i){
        return arraylist.add(new Integer(i));
    }
    public boolean addElement(ListenElement listenElement){
        if(listenElement!=null)
            return arraylist.add(listenElement);
        else
            throw new IllegalArgumentException("ListenElement muss nicht leer sein");
    }
    /*
     * return Wert:
     * - Integer oder
     * - echtes ListenElement
     */
    public Object getElement(int index){
        return arraylist.get(index);
    }
    /*
     * Abfrage nach Typen:
     * - false: Integer
     * - true: echtes ListenElement
     */
    public boolean isListenElement(int index){
        if(getElement(index) instanceof Integer)
            return false;
        else
            return true;

    }
}
 
Zuletzt bearbeitet:

Blender3D

Top Contributor
Code:
public class ListElement {
    private ListElement next = null;
    private Object data = null;

    public ListElement(Object data) {
        this.data = data;
        if (!isListElement() && !isInteger())
            throw new IllegalArgumentException("Only Integer or ListElement value allowed!");
    }

    public void add(ListElement data) {
        if (next == null)
            next = data;
        else
            next.add(data);
    }

    public Integer getInteger() {
        return (Integer) data;
    }

    public ListElement getListElement() {
        return (ListElement) data;
    }

    public boolean isInteger() {
        return data instanceof Integer;
    }

    public boolean isListElement() {
        return data instanceof ListElement;
    }

    /**
     * @return Number of elements in this list. A ListElement counts 1.
     */
    public int lenght() {
        int cnt = 1; // root contains first data value
        ListElement goNext = next;
        while (goNext != null) {
            cnt++;
            goNext = goNext.next;
        }
        return cnt;
    }

    /**
     * @return Number of Integers in this list.
     */
    public int size() {
        int cnt = 1; // root contains first data value
        ListElement goNext = next;
        while (goNext != null) {
            if (goNext.isListElement())
                cnt += ((ListElement) goNext).size();
            else
                cnt++;
            goNext = goNext.next;
        }
        return cnt;
    }

    @Override
    public String toString() {
        StringBuffer tmp = new StringBuffer();
        tmp.append("[");
        if (isListElement()) {
            tmp.append(((ListElement) data).toString());
        } else
            tmp.append(((Integer) data).toString());
        ListElement goNext = next;
        while (goNext != null) {
            tmp.append(", ");
            tmp.append(goNext.data.toString());
            goNext = goNext.next;
        }
        tmp.append("]");
        return tmp.toString();
    }
}
Code:
public class start {
    public static void main(String[] args) {
        ListElement root = new ListElement(0);
        ListElement list1 = new ListElement(10);
        for (int i = 20; i < 40; i += 10) {
            list1.add(new ListElement(i));
        }
        for (int i = 1; i < 4; i++) {
            if (i == 2)
                root.add(new ListElement(list1));
            root.add(new ListElement(i));
        }
       
        root.add(new ListElement(list1));
        System.out.println(root + "\t" + root.size());
    }
}
In der Art könnte man es machen. Frage ist wie sinnvoll das ist.
 

BadBat

Aktives Mitglied
Um das Thema abzuschließen hier meine Abgabe die Akzeptiert wurde. Vielen dank nochmal an alle für die Hilfe.

Java:
package util;

import java.util.List;

/**
* Eine Klasse zur Erstellung und verarbeitung einfach verketter Listen.
*
* @author Jan Müller
* @author Matthias Braeuer
*/
public class ListenElement<T> {

    private T data;
    private ListenElement next;

    /**
     * Default Konstruktor
     */
    public ListenElement() {

    }

    /**
     * Erzeugt ein Element dessen next Pointer = null ist
     *
     * @param data / Typ T Den Wert den das Element haben soll
     */
    public ListenElement(T data) {
        this.data = data;
    }

    /**
     * Erzeugt ein ListenElement welches auf einen nachfolger zeigt.
     *
     * @param data / Typ T Den Wert den das Element haben soll
     * @param next / Typ ListenElement das nachfolgende Element.
     */
    public ListenElement(T data, ListenElement next) {
        this.data = data;
        this.next = next;
    }

    public static boolean is_a_list(Object object) {
        if(object instanceof ListenElement){
            ListenElement element = (ListenElement) object;
            ListenElement next = element.next;

            return next == null || ListenElement.is_a_list(next);
        }

        return false;
    }

    public ListenElement getNext() {
        return this.next;
    }

    public T getData() {
        return data;
    }

    /**
     * Dreht die aufrufende Liste um und gibt dem First Pointer der umgedrehten
     * Liste zurück
     *
     * @return Typ ListenElement
     */
    public ListenElement reverse() {
        if (next == null)
            return this;
        ListenElement secondElem = next;
        next = null;
        ListenElement reverseRest = secondElem.reverse();
        secondElem.next = this;
        return reverseRest;
    }

    /**
     * Prüft ob der übergebene Parameter in der aufrufenden Liste vorhanden ist.
     *
     * @param element Object
     * @return Typ boolean / Falls die Liste ein Element mit dem zu prüfenden
     * Wert enthält -> true, sonst -> false
     */
    public boolean include(Object element) {
        ListenElement listElement = this;

        if (this.data == element) {
            return true;
        }

        while (listElement.next != null) {
            listElement = listElement.next;
            if (listElement.data == element) {
                return true;
            }
        }
        return false;
    }

    /**
     * Bildet aus der Aufrufenden Liste und dem Ãœbergabeparameter die
     * Differenzliste, die Differenzliste beinhaltet nur Elemente die in der
     * Aufrufenden Liste vorkommen jedoch nicht in der als Parameter übergebenen
     * Liste.
     *
     * @param liste / Typ ListenElement First Pointer der zu differenziernden
     *              Liste.
     * @return Typ ListenElement / First Pointer der Differenzliste
     */
    public ListenElement difflist(ListenElement liste) {
        ListenElement listElement = this; // Iterator Variable
        ListenElement prev = null; // Zwischenspeicher
        ListenElement differenzListe = new ListenElement(); // Output

        // Schleife um über alle Elemente der Liste drüber zu Iterieren
        while (listElement != null) {
            // Fall 2
            if (!liste.include(listElement.data)) {
                differenzListe = new ListenElement<>(listElement.data, prev);
                prev = differenzListe;
            }

            // Fall 2: Element wird nicht in Differenzliste übernommen

            listElement = listElement.next;
        }
        return differenzListe.reverse();
    }

    /**
     * Prüft ob der Übergabeparameter ein Präfix der aufrufenden Liste ist (nach
     * einem Präfix kommt noch was).
     *
     * @param praefix / Typ ListenElement First Pointer der anzunehmenden Präfix
     *                Liste
     * @return Typ boolean / Falls es ein Präfix ist -> true, Falls nicht ->
     * false
     */
    public boolean praefix(ListenElement praefix) {
        ListenElement listElement_1 = this; // Iterator Variable
        ListenElement listElement_2 = praefix; // Iterator Variable
        // Schleife um über alle Elemente der Liste drüber zu Iterieren
        while (listElement_2.next != null && listElement_1.next != null) {
            // Fall 1
            if (listElement_2.data == listElement_1.data) {
                listElement_1 = listElement_1.next;
                listElement_2 = listElement_2.next;
                // Fall 2
            } else {
                return false;
            }
        }
        // Prüfung ob in der aufrufenden Liste noch Elemente enthalten
        // sind.(hinter einem Präfix kommt noch was)
        return listElement_1.next != null;
    }

    /**
     * Prüft ob der Übergabeparameter ein Suffix der aufrufenden Liste ist (vor
     * einem Suffix kommt noch was).
     *
     * @param suffix / Typ ListenElement First Pointer der anzunehmenden Suffix
     *               Liste
     * @return Typ boolean / Falls es ein Suffix ist -> true, Falls nicht ->
     * false
     */
    public boolean suffix(ListenElement suffix) {
        ListenElement listElement_1 = this;// Iterator Variable
        // Schleife um über alle Elemente der Liste drüber zu Iterieren
        // Fall 2
        while (listElement_1.next != null) {
            listElement_1 = listElement_1.next;
            // Fall 1
            if (listElement_1.data == suffix.data) {
                ListenElement liste1 = listElement_1;
                ListenElement liste2 = suffix;
                // Prüft den Rest der Liste auf gleiche Werte
                while ((liste1.next != null && liste2.next != null) && (liste1.data == liste2.data)) {
                    liste1 = liste1.next;
                    liste2 = liste2.next;
                }
                // Prüft ob auch wirlich beide Listen leer und somit identisch
                // sind
                if (liste1.next == null && liste2.next == null) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * Prüft ob der Übergabeparameter ein Infix der aufrufenden Liste ist(vor
     * und hinter einem Infix kommt noch was).
     *
     * @param infix / Typ ListenElement FirstPointer der Infix Liste.
     * @return Typ boolean / Falls es ein Infix ist -> true, Falls nicht ->
     * false
     */
    public boolean infix(ListenElement infix) {
        ListenElement listElement_1 = this;// Iterator Variable
        // Prüft ob der übergabeparameter ein Präfix oder Suffix ist
        if (listElement_1.suffix(infix) || listElement_1.praefix(infix)) {
            return false;
        } else {
            // Schleife um über alle Elemente der Liste drüber zu Iterieren
            while (listElement_1.next != null) {
                listElement_1 = listElement_1.next;
                // Fall 1 (Präfixprüfung)
                if (listElement_1.praefix(infix)) {
                    return true;
                }
            }
            // Fall 2 (Präfixprüfung)
            return false;
        }
    }

    /**
     * Zählt die Anzahl gerader und ungerader Listen in einer Liste inklusive der Liste selbst.
     *
     * @return int[]
     */
    public int[] eo_count() {
        int even = 0;
        int odd = 0;

        if (isListEven()) {
            even += 1;
        }

        if (isListOdd()) {
            odd += 1;
        }

        int[] listCount = count();

        even += listCount[0];
        odd += listCount[1];

        return new int[]{even, odd};
    }

    /**
     * Zählt die Anzahl gerader und ungerader Listen in einer Liste
     *
     * @return int[]
     */
    public int[] count() {
        int even = 0;
        int odd = 0;

        if (ListenElement.is_a_list(this.getData())) {
            int[] evenOdd = ((ListenElement) this.getData()).eo_count();

            even += evenOdd[0];
            odd += evenOdd[1];
        }

        if (this.getNext() == null) return new int[]{even, odd};

        int[] nextEvenOdd = this.getNext().count();

        even += nextEvenOdd[0];
        odd += nextEvenOdd[1];

        return new int[]{even, odd};
    }


    private boolean isListEven() {
        return length() % 2 == 0;
    }

    private boolean isListOdd() {
        return length() % 2 == 1;
    }

    public int length() {
        if (this.getNext() == null) return 1;

        return 1 + this.getNext().length();
    }

    /**
     * Löscht in einer Liste "element" an der Position "position".
     *
     * @param position / Typ char "'a' für alle vorkommen, 'e' für erstes vorkommen,
     *                 'l für letztes vorkommen'"
     * @param element  / Typ ListenElement "Das Element welches aus der Liste
     *                 gelöscht werden soll"
     * @return ListenElement / First Pointer von der neuen Liste.
     */
    public ListenElement del_element(char position, ListenElement element) {
        switch (position) {
            case 'a':
                return delAll(this, element);
            case 'e':
                return delFirst(this, element);
            case 'l':
                return delLast(this, element);
            default:
                return null;
        }
    }

    private ListenElement delAll(ListenElement list, ListenElement element) {
        ListenElement prev = null;// Zwischenspeicher
        ListenElement result = new ListenElement();// Output

        // Schleife um über alle Elemente der Liste drüber zu Iterieren
        while (list != null) {
            // Fall 1
            if (list.data != element.data) {
                result = new ListenElement<>(list.data, prev);
                prev = result;
            }
            // Fall 2: Element wird nicht an Ergebnislist angehängt
            // -> Ergebnisliste enthält dieses Element nicht und wurde aus Liste gelöscht

            list = list.next;
        }

        return result.reverse();
    }

    private ListenElement delFirst(ListenElement list, ListenElement element) {
        ListenElement prev = null;// Zwischenspeicher
        ListenElement result = new ListenElement();// Output
        boolean finish_flag = false;

        // Schleife um über alle Elemente der Liste drüber zu Iterieren
        while (list != null) {
            // Fall 1
            if (list.data != element.data || finish_flag) {
                result = new ListenElement<>(list.data, prev);
                prev = result;
            }
            // Fall 2
            else if (!finish_flag) {
                finish_flag = true;
            }

            list = list.next;
        }

        return result.reverse();
    }

    private ListenElement delLast(ListenElement list, ListenElement element) {
        ListenElement result;

        result = delFirst(list.reverse(), element);

        return result.reverse();
    }

    /**
     * Ersetzt in einer Liste "element" durch "element2" an der Position
     * "position".
     *
     * @param position / Typ char "'a' für alle vorkommen, 'e' für erstes vorkommen,
     *                 'l für letztes vorkommen'"
     * @param element  / Typ ListenElement "Das Element welches aus der Liste ersetzt
     *                 werden soll"
     * @param element2 / Typ ListenElement "Das Element welches (element) ersetzt"
     * @return ListenElement / First Pointer von der neuen Liste.
     */
    public ListenElement substitute(char position, ListenElement element, ListenElement element2) {
        switch (position) {
            case 'a':
                return substituteAll(this, element, element2);
            case 'e':
                return substituteFirst(this, element, element2);
            case 'l':
                return substituteLast(this, element, element2);
            default:
                return null;
        }
    }

    private ListenElement substituteAll(ListenElement list, ListenElement element, ListenElement element2) {
        ListenElement prev = null;// Zwischenspeicher
        ListenElement result = new ListenElement(); // Output

        // Schleife um über alle Elemente der Liste drüber zu Iterieren
        while (list != null) {
            // Fall 1
            if (list.data != element.data) {
                result = new ListenElement<>(list.data, prev);
            }
            // Fall 2
            else {
                result = new ListenElement<>(element2.data, prev);
            }

            prev = result;
            list = list.next;
        }

        return result.reverse();
    }

    private ListenElement substituteFirst(ListenElement list, ListenElement element, ListenElement element2) {
        ListenElement prev = null;// Zwischenspeicher
        ListenElement result = new ListenElement(); // Output
        boolean finish_flag = false;

        // Schleife um über alle Elemente der Liste drüber zu Iterieren
        while (list != null) {
            // Fall 1
            if (list.data != element.data || finish_flag) {
                result = new ListenElement<>(list.data, prev);
            }
            // Fall 2
            else if (!finish_flag) {
                result = new ListenElement<>(element2.data, prev);
                finish_flag = true;
            }

            prev = result;
            list = list.next;
        }

        return result.reverse();
    }

    private ListenElement substituteLast(ListenElement list, ListenElement element, ListenElement element2) {
        ListenElement result; // Output

        result = substituteFirst(list.reverse(), element, element2);

        // Ausgabe Formatierung Liste muss nochmals gedreht werden
        return result.reverse();
    }

    public boolean deepEquals(ListenElement other) {
        if (this.getNext() == null && other.getNext() == null) return this.equals(other);
        if (other.getNext() == null || this.getNext() == null) return false;

        return this.equals(other) && this.getNext().deepEquals(other.getNext());
    }

    public String toDeepString() {
        if (this.getNext() == null) return toString() + ", " + "null";

        return toString() + ", " + this.getNext().toDeepString();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        ListenElement other = (ListenElement) obj;
        return data.equals(other.data);
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + data.hashCode();
        return result;
    }

    @Override
    public String toString() {
        return "[data=" + data + "]";
    }
}
 

mrBrown

Super-Moderator
Mitarbeiter
Ich muss sagen, dass überrascht mich...mag aber auch an dem liegen, der's kontrolliert hat, ich hätte das nicht akzeptiert...
 

mrBrown

Super-Moderator
Mitarbeiter
Was sollte denn zB new ListenElement(4242).include(4242) ergeben, ohne ausprobieren?
(und zusätzlich dann new ListenElement(4242).equals(new ListenElement(4242))?)
 

BadBat

Aktives Mitglied
Was sollte denn zB new ListenElement(4242).include(4242) ergeben, ohne ausprobieren?
(und zusätzlich dann new ListenElement(4242).equals(new ListenElement(4242))?)
naja wenn du mittels new ListenElement(4242) eine 1 elementige Liste erstellst [4242] dann wird die Liste mit sicherheit das Element mit dem Wert 4242 enthalten ^^.

Ich verstehe aber deine verwirrung der Code ist auch bischen Strange weil wir uns an einen Prolog Algorithmus halten mussten. Hätte ich frei Proggen dürfen hätte ich es auch ganz anders Realisiert. Aber die Aufgabe war ja schon von den Anforderungen Broke.
 

mrBrown

Super-Moderator
Mitarbeiter
naja wenn du mittels new ListenElement(4242) eine 1 elementige Liste erstellst [4242] dann wird die Liste mit sicherheit das Element mit dem Wert 4242 enthalten ^^.
Ach ja? Vielleicht solltest du es besser doch mal ausprobieren ;)

Ich verstehe aber deine verwirrung der Code ist auch bischen Strange weil wir uns an einen Prolog Algorithmus halten mussten. Hätte ich frei Proggen dürfen hätte ich es auch ganz anders Realisiert. Aber die Aufgabe war ja schon von den Anforderungen Broke.
Verwirrt würde ich das nicht nennen...
 

mrBrown

Super-Moderator
Mitarbeiter
Doch würde ich schon. Ich denke auch dass das Element dann in der Liste drin ist. Warum denn nicht ?
Kopier den Code für die Liste und für einfach mal Assert.assertTrue((new ListenElement(4242).include(4242))); aus, dann sieht du es ;)

Den Grund dafür einfach zu verraten wäre doch langweilig, da könnte man durchaus selbst drauf kommen, der richtige Code wird schließlich an anderen Stellen benutzt ;)
Drin ist es natürlich schon, nur halt nicht drin nach Definition der Liste.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
Vivien Auf eine Variable von einer anderen Klasse aus zugreifen Java Basics - Anfänger-Themen 3
K Übergabe des Wertes einer Variable aus main() in eine Klassenmethode Java Basics - Anfänger-Themen 8
N Wie kann ich eine meine Variable Final machen? Java Basics - Anfänger-Themen 1
V Erste Schritte Eine Array-Variable mit Benutzereingaben befüllen Java Basics - Anfänger-Themen 3
A Kann man eine Methode als Variable speichern und danach noch verändern? Java Basics - Anfänger-Themen 6
R Warnung, wenn eine Variable eingegeben wird Java Basics - Anfänger-Themen 6
N Best Practice Rückgabe eines Terminal Befehls in eine Variable speichern Java Basics - Anfänger-Themen 27
S Wie erstelle ich eine Vorbedingung für eine Variable einer Methode ? Java Basics - Anfänger-Themen 5
S Warum kann ich nicht mehr als eine Variable in einer for Schleife deklarieren ? Java Basics - Anfänger-Themen 1
F [OOP] Auf eine Variable aus meherer Klassen zugreifen Java Basics - Anfänger-Themen 22
S Cannot find symbol (symbol ist eine Variable) Java Basics - Anfänger-Themen 13
T static String Variable wird nur beim ersten aufruf durch eine Funktion geändert. Java Basics - Anfänger-Themen 16
H Innerhalb einer Methode eine Variable der aufrufenden Methode ändern? Java Basics - Anfänger-Themen 2
G Im ActionListener eine "äußere" Variable verändern Java Basics - Anfänger-Themen 13
P Variablen Wie kann ich eine lokale Variable in eine andere Methode einfügen? Java Basics - Anfänger-Themen 27
A Eine Variable in verschiedenen Ereignisprozeduren benutzen Java Basics - Anfänger-Themen 7
D Java erkennt eine deklarierte Variable nicht Java Basics - Anfänger-Themen 2
M Variablen Zugriff von außerhalb eines Blockes auf eine Variable innerhalb eines Blockes Java Basics - Anfänger-Themen 2
S Auf eine variable/objekt eines frames zugrifen Java Basics - Anfänger-Themen 22
I Variablen Wie initialisiert man in Java eine Variable ohne das Setzen von 0 oder einer anderen Zahl? Java Basics - Anfänger-Themen 8
B auf private Variable durch eine Methode zugreifen Java Basics - Anfänger-Themen 8
D Eine Variable in mehreren "switch" Java Basics - Anfänger-Themen 24
W Klassen Kann eine Variable nicht aus einer Klasse bekommen Java Basics - Anfänger-Themen 9
A Threads Eine Klasse muss auf Variable der Anderen warten. Java Basics - Anfänger-Themen 6
J Eine int Variable jede Sekunde um 1 hocnzählen Java Basics - Anfänger-Themen 3
D Von einer Methode auf eine lokale Variable in der Main zugreifen? Java Basics - Anfänger-Themen 15
H text feld eine variable zu weisen Java Basics - Anfänger-Themen 3
E Variable aus einer Methode heraus in eine andere Klasse übergeben Java Basics - Anfänger-Themen 13
S Wie überprüfe ich eine Zahl (in einer Char-Variable) auf einstelligkeit? Java Basics - Anfänger-Themen 8
U Wert an eine Variable anhängen Java Basics - Anfänger-Themen 2
M Wann muss man eine Variable mit set-/get-Methoden in eine Bean schreiben? Java Basics - Anfänger-Themen 19
H eine als public deklariete Variable wird nicht gefunden Java Basics - Anfänger-Themen 6
N Per Java in ein HTML-Suchfeld eine Variable reinschreiben Java Basics - Anfänger-Themen 4
G zwei Objekte, eine Variable Java Basics - Anfänger-Themen 14
R Eine Variable soll den Wert von t_leer (eines JLabel)annehm Java Basics - Anfänger-Themen 3
T KeyListener, Nullpointer und eine unbekannte Variable Java Basics - Anfänger-Themen 6
G Wie ändere ich eine Variable in jedem Schleifendurchlauf? Java Basics - Anfänger-Themen 15
P wie bekomme ich ein array in eine string variable Java Basics - Anfänger-Themen 11
M Eine Variable darauf überprüfen ob sie gesetzt wurde Java Basics - Anfänger-Themen 6
G Wie erzeuge ich eine variable Menge von Variablen! Java Basics - Anfänger-Themen 2
T Von Main auf eine Variable in void zugreifen Java Basics - Anfänger-Themen 4
M Array - eine Variable auslesen Java Basics - Anfänger-Themen 4
S mit String eine Variable ansprechen Java Basics - Anfänger-Themen 5
A Wert einer Variable an eine Methode in einer anderen Klasse. Java Basics - Anfänger-Themen 4
S Daten in eine Variable in einem anderen Java File schreiben Java Basics - Anfänger-Themen 10
G Eine Variable in mehreren Klassen Java Basics - Anfänger-Themen 10
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
I In unterschiedlichen Applikation Zugriff auf eine gemeinsame Anwendung? Java Basics - Anfänger-Themen 8
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
T Ich brauche eine Schleife die eine beliebige Zahl so lange durch 10 teilt bis zur Null Java Basics - Anfänger-Themen 5
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
N Ich kriege ganze zeit die Fehlermeldung "Inhalt der Zwischenablage kann nicht in die ausgewählten Elemente eingefügt werden" hat jemand eine Lösung? Java Basics - Anfänger-Themen 6
M Vergleichen, ob eine Liste länger als andere ist Java Basics - Anfänger-Themen 6
T Methode soll etwas ausrechnen und zurückgeben (klappt nd) hat wer eine Idee? Java Basics - Anfänger-Themen 11
Shadowrunner Variablen Gibt es eine Möglichkeit die Ziffern/Stellen einer Zahl fest zu legen? Java Basics - Anfänger-Themen 3
Kingdako Wie löse ich eine Mathematische Formel mit Arrays und Schleifen? Java Basics - Anfänger-Themen 32
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
G Wie wartet man bis ein URL eine Antwort zurückgibt? Java Basics - Anfänger-Themen 5
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
S 2 Reihen ratio-btn, eine Reihe funktioniert andere nicht Java Basics - Anfänger-Themen 4
T Eingabe durch eine Zahl dividieren nachgucken? Java Basics - Anfänger-Themen 4
M mit Maven eine ausführbare Jar bauen Java Basics - Anfänger-Themen 7
P Java Selenium . Parameterized.Parameters erzeugt eine Fehlermeldung Java Basics - Anfänger-Themen 14
J Zugriff auf eine 2. Klasse die per UI-Designer erstellt wurde Java Basics - Anfänger-Themen 1
M Eine Funktion zuweisen Java Basics - Anfänger-Themen 3
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
A Methoden Guten Tag , ich wollte so machen dass wenn meine frog an eine fly/bee geht dann an meine Tafel geht der zahl +1 hoch. Java Basics - Anfänger-Themen 2
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
J Beim Start des Programms zB. eine Linie in JPanel ausgeben Java Basics - Anfänger-Themen 4
L Methoden Eine Methode um zu testen ob es ein Nachbar gibt Java Basics - Anfänger-Themen 10
S Eine Idee umsetzen ganz schnell!? Java Basics - Anfänger-Themen 68
I Grundsatzfrage: Belegt eine Referenz auf 'null' RAM, und wenn ja - wieviel ;-) ? Java Basics - Anfänger-Themen 5
jeff98 Wie kann man in Java eine Zeichenformation ausgeben? Java Basics - Anfänger-Themen 9
K loop pausieren für eine bestimmte Anzahl? Java Basics - Anfänger-Themen 1
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
Thomas06 Wie kann man mithilfe von boolean herausfinden ob eine zahl durch 5 und 7 teilbart ist ? Java Basics - Anfänger-Themen 7
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
A Eclipse IDE - Wie bekomme ich eine ältere Version Java Basics - Anfänger-Themen 6
F Wie kann ich eine Funktion schreiben, die nur in bestimmten Fällen einen Wert zurückgibt? Java Basics - Anfänger-Themen 5
berserkerdq2 Warum muss man manchmal in der RUnmethode sleep in eine schleife tun? Java Basics - Anfänger-Themen 9
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
berserkerdq2 Sende eine Nachricht an den Client und leere den Ausgabestorm, was ist damit genau gemeint? Java Basics - Anfänger-Themen 3
sserio Prüfen, ob eine Zahl eine periodische Zahl ist Java Basics - Anfänger-Themen 20
L Anpassung der Spaltenbreite auch auf eine zweite Tabelle anwenden Java Basics - Anfänger-Themen 8
NadimArazi Wie kann ich eine collision detection für die Paddles in meinem Pong Programm hinzufügen? Java Basics - Anfänger-Themen 4
JordenJost Java ist auch eine Insel für Anfänger Java Basics - Anfänger-Themen 2
berserkerdq2 Warum soll ich shuffle nutzen, um bei Rückgabewert Collection eine Liste zurückzugeben? Java Basics - Anfänger-Themen 3
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
berserkerdq2 Überprüfen ob eine Schreibberechtigung auf ein file exisitert bzw. ob man dieses file löschen kann, wie? Java Basics - Anfänger-Themen 9
sserio Java Fx, wie erstellt man einen EventHandler, der durch das Drücken eines Button Texte in eine Table view einfügt Java Basics - Anfänger-Themen 17
M Eine Methode die erkennt ob die ein gegebene zahl größer oder kleiner sein muss Java Basics - Anfänger-Themen 2
Avalon Warum funktioniert eine Bedingung und eine andere nicht? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben