Liste mit Objekten und Listen

SebOeh

Mitglied
Hallo,
ich habe eine Klasse mit einem Attribut von Typ Liste. Diese Liste enthält Elemente der gleichen Klasse.
Java:
package MatheAufgaben;

import java.util.*;

public class MatheTerm {

    List termlist = new LinkedList();

    MatheTerm(int zahl) { termlist.add((Integer) zahl); }

    void erweitereTerm(int zahl){
        termlist.add('+');
        termlist.add((Integer) zahl);
    }
    
     void erweitereTerm(MatheTerm otherMatheTerm){
        termlist.add('+');
        termlist.add(otherMatheTerm);
    }
 
}

Wie man sieht, kann die Liste in einem MatheTerm-Object Integers, Charaktere und weitere MatheTerm-Objecte beinhalten. Die Liste kann beliebig lang und tief sein.
Wie kann ich so iterieren oder rekursiv aufrufen, daß ich alle Elemente in der richtigen Reihenfolge ausgebe? Dabei sollen alle Elemente eines Unterterms ausgegeben werden, bevor man mit dem weiteren Listenelement weitermacht.

Noch eine Frage: ich werde ja beliebige Rechenarten erlauben (nicht nur '+') und dabei kommen auch nicht-ASCII Zeichen vor. Was muß man dabei beachten?
 

InfectedBytes

Top Contributor
Eine Liste speichert nur "hintereinander", du willst aber eher eine Baumstruktur haben.
Dementsprechend wäre es praktikabler diese Struktur zu verwenden
 

SebOeh

Mitglied
Soweit ich jetzt gelesen habe, ist das java Treeset nicht unbedingt für eine Baumstruktur da.
JavaInsel: Speichert TreeSet ein neues Element, so fügt TreeSet das Element automatisch sortiert in die Datenstruktur ein.
Das will ich aber nicht, die Elemente sollen die Reihenfolge behalten wie sie eingefügt wurden.
Auch eine Treemap wäre zu viel, da ich keinen assoziativen Speicher, also keinen Schlüssel brauche.
Da die Elemente ihre Reihenfolge behalten sollen, ist eine List wohl doch das Richtige; aber bitte korrigieren, ich bin ja kein Experte, nur einer der zuerst nachprüft.
Für mein Problem habe ich aber schon eine Lösung gefunden:
Java:
    static void schreibe(MatheTerm einMatheTerm) {
        for (Object termteil : einMatheTerm.termlist) {
            if(termteil instanceof MatheTerm) schreibe((MatheTerm) termteil);
            else System.out.print(termteil);
        }

Mir war nicht eingefallen, das Object termteil in ein MatheTerm umzuwandeln beim rekursiven Aufruf.
 
Zuletzt bearbeitet:

InfectedBytes

Top Contributor
Eine Baumstruktur kann man sich leicht selber bauen.
Ein einfacher Baum für Terme würde ungefähr so aussehen:
Java:
public abstract class Node {
  public abstract double getValue();
}
public class InnerNode {
  private Node left;
  private Operator operator;
  private Node right;
  //konstruktor, getter/setter, etc.
  public double getValue() {
    //falls Addition:
    return left.getValue() + right.getValue();
    //je nach operator anders rechnen
  }
}

public class LeafNode extends Node {
  private double value;
  public double getValue() { return value; }
}
 
Zuletzt bearbeitet:

SebOeh

Mitglied
Ja, ein Binär Baum will ich aber auch nicht. Eine Summe kann ZB ewig lang sein und es muss oder darf nicht vorher festgelegt sein welche und wie viele Summanden zuerst addiert werden sollen. Ein Zweig kann sich somit in mehreren Bauelementen abzweigen. Wenn ein Zweig ein Element der Klasse MatheTerm ist, dann entspricht das einem Eingeklammerten mathematischen Ausdruck.
Es geht hier um die Erzeugung von Mathe-Aufgaben.

Was mir an meinem Aufbau nicht gefällt, ist daß jedes zweite Elemente ein Operator sein muß. Die Struktur sollte so sein, dass die Verknüpfung der Elemente (Zahlen) zueinander die Operatoren (plus und minus) sind. Mmmh, jetzt fällt mir auch ein wie ich es machen soll. Die Elemente wären Objekte einer Klasse mit 2 Attributen: Zahl (oder Mathe Term) und eine Rechenart zum nächsten Element der Liste.

Ich probiere es morgen aus falls mich im Traum nichts besseres einfällt
 

SebOeh

Mitglied
Ich brauche nochmal Hilfe und es geht um das gleiche Thema.

Meine Klasse MatheTerm hat ein Attribut der Schnittstelle List. Dabei kann ich den Elemententyp der Liste nicht angeben, da diese entweder Integer sind oder wiederum MatheTerm-Objekte. Es könnte dadurch passieren, daß Objekte in die Liste reinkommen, die von einer ganz fremden Klasse sind. Selbstverständlich könnte man das durch die richtigen Methoden für add abfangen. Das ist aber aufwendig, da ich einen try-catch Block erzeugen muß und im Moment gar nicht weiß, was alles passieren könnte.

Viel eleganter wäre es, wenn man von vornherein sagen könnte, daß der Typ entweder Integer oder MatheTerm ist. Mir ist es noch nicht eingefallen, wie man das mit Generics realisieren könnte, denn die Liste soll beide Typen akzeptieren. Leider gibt es sowas von überladenen Klassendefinitionen nicht, oder? Damit meine ich Klassen mit gleichem Namen aber unterschiedlicher Struktur.

Alternativ könnte ich auch eine ad-hoc neue Listenschnittstelle programmieren, dabei glaube ich daß ich immer noch das gleiche Problem haben werde.
 

SebOeh

Mitglied
Sorry für die Selbstgespräche, es ist mir gerade eingefallen wie das gehen soll:
Java:
public class MatheTerm {
    private class termelement<T>{
        T zahl_Oder_MatheTerm;
        rechenart OperatorZumNaechsten = null;
    }
        
    List<termelement>  term = new LinkedList(); 
}

Danke fürs Zuhören, vielleicht hat trotzdem jemand eine bessere Idee :)
 

Natac

Bekanntes Mitglied
Die "richtige" Lösung wäre imo folgende:
  • Neues ein Interface "MathElement".
  • Neue Klasse "MathNumber" zum wrappen von Zahlen
  • "MathNumber" implementiert "MathElement"
  • "MatheTerm" implementiert "MathElement"
  • Die Liste enthält nur noch MathElemente

Und eigentlich müsste man die Datenstruktur noch weiter aufbohren. Es gibt Operationen, die benötigen zwei Seiten, und welche, die benötigen nur eine (bspw. Wurzel). Wobei jede Seite sich wieder aus beliebig vielen weiteren Operationen zusammensetzen kann. Und sowas bildet man eigentlich per Composite-Pattern ab.
 
Zuletzt bearbeitet:

SebOeh

Mitglied
@Natac: danke für die wertvolle Info. Auch danke an InfectedBytes.
Ich bin dabei mich noch über diese Kompostinturen ( :) ) zu informieren. Beim Überfliegen ist mir der Vorteil noch nicht aufgefallen.
 

SebOeh

Mitglied
Ich arbeite langsam an diesem Projekt, da ich aus beruflichen Gründen wenig Zeit habe.
Wie es zu erwarten war, muß man sogar die von Natac vorgeschlagene "richtige" Lösung verwenden. Mit Composite habe ich mich noch nicht beschäftigt, werde aber wohl, da ich grundsätzlich die gleiche Struktur brauche für verschiedene Rechenarten. Die Struktur muß man selber programmieren, da sie wohl kein Bestandteil von Java ist.

Ich habe beim jetzigen Stand eine ganz einfache Frage:
Es ist ja so, daß MathNumber nur in MatheTerm verwendet wird und werden soll (erst mal). Sie kann als Innere Klasse von MatheTerm. Soweit so gut. Auch die Schnittstelle MathElement wird nur für MathNumber und MatheTerm verwendet; daher hätte ich gerne, daß man MathElement nicht sieht. Zuerst habe ich das interface im selben File erklärt wie die Klasse, man kann aber das interface nicht private machen. Alternativ kann man die Klasse im interface-file deklarieren, mit dem gleichen Ergebnis. Wie macht man es dann?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Generische Liste aus Comparable-Objekten Java Basics - Anfänger-Themen 6
M Löschen von Objekten während Iteration über Liste Java Basics - Anfänger-Themen 9
E Erste Schritte Sortieren von Objekten in doppelt-verlinkter Liste Java Basics - Anfänger-Themen 9
H Liste mit Objekten sortieren Java Basics - Anfänger-Themen 2
R Liste mit neu erzeugten Objekten befüllen Java Basics - Anfänger-Themen 4
D Datentypen Liste mit Objekten aus mehreren Klassen Java Basics - Anfänger-Themen 3
M Collections{Liste aus Objekten erzeugen] Java Basics - Anfänger-Themen 19
JohnMurdoch Methoden von verschiedenen Objekten in Liste aufrufen Java Basics - Anfänger-Themen 3
M String in Liste von Objekten suchen und verändern? Java Basics - Anfänger-Themen 8
F Generische Liste von generischen Objekten. Java Basics - Anfänger-Themen 3
R Liste von Objekten aus selbstdef. Klasse auslesen Java Basics - Anfänger-Themen 2
R Liste in Variable speichern Java Basics - Anfänger-Themen 6
R Liste und Arrays Java Basics - Anfänger-Themen 12
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
M Verkettete Liste Java Basics - Anfänger-Themen 1
M Vergleichen, ob eine Liste länger als andere ist Java Basics - Anfänger-Themen 6
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
D remove Object von einer Liste von Obejcts Java Basics - Anfänger-Themen 3
E Elemente aus Liste entfernen und hinzufügen Java Basics - Anfänger-Themen 3
M Nullpointer beim befüllen meiner Liste im Object Java Basics - Anfänger-Themen 3
D Länge einer Liste aufrufen. Java Basics - Anfänger-Themen 19
B Objekt aus generalisierter Liste entfernen Java Basics - Anfänger-Themen 11
H Liste Knoten NullPointerException Java Basics - Anfänger-Themen 7
W Liste mit Listen in JTable darstellen Java Basics - Anfänger-Themen 1
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
E Suchfunktion in einer Liste Java Basics - Anfänger-Themen 39
T ungeordnete Werte-Paare in einer Liste Java Basics - Anfänger-Themen 7
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
berserkerdq2 Warum soll ich shuffle nutzen, um bei Rückgabewert Collection eine Liste zurückzugeben? Java Basics - Anfänger-Themen 3
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
f3mys Objektwerte in Liste speichern und wieder abrufen Java Basics - Anfänger-Themen 23
H Java verkettete Liste, Wert eines Index zurückgeben Java Basics - Anfänger-Themen 1
K Warum ist die binäre Suche bei der verketteten Liste nicht so effektiv? Java Basics - Anfänger-Themen 3
I 2D-Array Position der Liste ausgeben. Java Basics - Anfänger-Themen 2
I Liste von Infos von einer eigenen Annotation in Liste speichern Java Basics - Anfänger-Themen 0
P Doppelte werte in einer Liste zählen Java Basics - Anfänger-Themen 11
Dorfschmied Kartesisches Produkt von zwei Liste mit Hashmaps<String,String> erstellen Java Basics - Anfänger-Themen 4
Igig1 Autoparkplatz verkettete Liste erstes und letztes Auto Java Basics - Anfänger-Themen 13
thor_norsk Verkette Liste Java Basics - Anfänger-Themen 27
R Rückgabe: verkettete Liste Java Basics - Anfänger-Themen 2
R einfach verkettete Liste Java Basics - Anfänger-Themen 1
R einfach verkettete Liste Java Basics - Anfänger-Themen 12
O Doppelt verkette Liste Element löschen Java Basics - Anfänger-Themen 15
B GUI extension mit einer Liste verbinden Java Basics - Anfänger-Themen 1
B Verkettete Liste durchgehen und einzelne Elemente in neue Liste tun Java Basics - Anfänger-Themen 9
B Bin komplett am verzweifeln :( Verkettete Liste die Objekte hat Attribut auslesen Java Basics - Anfänger-Themen 14
M Java Liste streamen Java Basics - Anfänger-Themen 10
AmsananKING Aussortierung einer Liste Java Basics - Anfänger-Themen 8
A Objekte mit Parametern in eine Liste packen Java Basics - Anfänger-Themen 19
A Korrigierte <String> Liste zurückgeben Java Basics - Anfänger-Themen 22
S Kann nicht auf die Liste zugreifen mit der Methode!? Java Basics - Anfänger-Themen 3
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
J Doppelt verkette Liste ich bitte um Hilfe Java Basics - Anfänger-Themen 4
I Liste gruppieren nach Monat? Java Basics - Anfänger-Themen 5
districon Element in Liste einfügen Java Basics - Anfänger-Themen 1
B Hilfe bei Map Liste erstellen Java Basics - Anfänger-Themen 10
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
Y Knoten an einem gegebenen Index aus einer Liste entfernen. Java Basics - Anfänger-Themen 6
H Daten aus einer Datei in eine Liste speichern Java Basics - Anfänger-Themen 23
Gaudimagspam Linked Liste Java Basics - Anfänger-Themen 4
Z Liste umkehren Java Basics - Anfänger-Themen 1
S Eine Liste kopieren Java Basics - Anfänger-Themen 13
java3690 Java- liste füllen ud die werte addieren Java Basics - Anfänger-Themen 13
java3690 Liste mit zufälligen zahlen füllen Java Basics - Anfänger-Themen 27
java3690 eine liste sortieren Java Basics - Anfänger-Themen 12
J Element aus Liste nehmen Java Basics - Anfänger-Themen 3
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
P Was genau bringt mir es ein Array in eine Liste zu bringen Java Basics - Anfänger-Themen 3
A Doppelt verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 17
P Verschachtelte Array Liste Java Basics - Anfänger-Themen 2
H Liste speichern. Was lässt sich verbessern? Java Basics - Anfänger-Themen 7
P Performance Array und Liste Java Basics - Anfänger-Themen 13
M QuickSort und Liste Java Basics - Anfänger-Themen 6
N Methode um Objekte einer Liste hinzuzufügen Java Basics - Anfänger-Themen 1
B Summe von Property innerhalb einer Liste via Lambda Java Basics - Anfänger-Themen 1
V Collections int Werte in einer Liste sortieren Java Basics - Anfänger-Themen 23
B Neue Liste erstellen, wenn Objekte bestimmte Referenz hat / Gruppierung von Einträgen Java Basics - Anfänger-Themen 12
V_Fynn03 Beliebiges Element in einer Liste löschen (Java)(Lineare Datenstrukturen) Java Basics - Anfänger-Themen 9
L Baum aus Integer Liste erstellen Java Basics - Anfänger-Themen 0
CptK Koordinate in Liste suchen Java Basics - Anfänger-Themen 20
C Verschiedene Objekte in einer Liste speichern Java Basics - Anfänger-Themen 6
M Ausgabe einer Liste welche mehrere Stacks enthält Java Basics - Anfänger-Themen 3
D Doppelt Verkettete Zirkular-Liste Java Basics - Anfänger-Themen 1
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
M Array liste Verdrehen Java Basics - Anfänger-Themen 8
A Verkettete Liste Java Basics - Anfänger-Themen 2
J Strings untereinander in einer Liste vergleichen Java Basics - Anfänger-Themen 18
B Liste von Tagen generieren ab einem bestimmten Datum und Endedatum Java Basics - Anfänger-Themen 4
S IndexOutOfBoundsException beim hinzufügen eines Elements zu einer Liste Java Basics - Anfänger-Themen 11
B Liste sortieren? Java Basics - Anfänger-Themen 4
O Anonyme Klasse einer Liste erstellen Java Basics - Anfänger-Themen 7
B SWAP List; Liste neu anordnen Java Basics - Anfänger-Themen 4
B CSS Klassen in eine Liste schreiben Java Basics - Anfänger-Themen 4
B Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 8
L verkettete Liste Java Basics - Anfänger-Themen 15
scratchy1 doppelt verkettete Liste testen Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben