java-forum.org
JBoss Seam
Alter Preis: 39,95 €
Jetzt: 0,00 €

zzgl. Versandkosten

Zurück   java-forum.org > Java - Programmierung > Java Basics - Anfänger-Themen

Java Basics - Anfänger-Themen Fragen ausschließlich zu Java-Grundlagen von Ein- und Umsteigern

Antwort    
Themen-Optionen Thema durchsuchen Ansicht
Alt 24.02.2010, 08:52   #1 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 25.12.2009
Beiträge: 121
Abgegebene Danke: 7
Erhielt 6 Danke für 6 Beiträge
Standard Werte eines Objekts übernehmen

Ich programmiere Binärbäume. Ich wollte nun in der GUI eine Liste von Bäumen erstellen und jedes Mal, wenn der 'Benutzer' etwas am Baum verändert, werden die Änderungen vorgenommen und der Baum wird der Liste hinzugefügt. Das will ich zumindest abzielen.
Ich arbeite hier mit einer ArrayList und den veränderten Baum in die Liste zu übernehmen, sieht folgendermaßen aus:
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
Baum newBaum = new Baum()
newBaum = binbaum;      // binbaum = der Baum, den der Benutzer sieht
binaerbaeume.add(newBaum);
Das Problem liegt darin, dass jedes Mal, wenn am binbaum, also am 'sichtbaren' Baum etwas geändert wird, werden die Änderungen in alle Unterbäume der ArrayList übernommen, und mein Ziel, dadurch ein 'Rückgängig machen (STRG+Z)' zu entwickeln, scheitert.
Ich könnte natürlich eine Methode einbauen, mit der ich alle Werte des binbaums ermittle und einen ganz neuen Baum erzeuge, aber wäre das nicht zu kompliziert?

Habt ihr irgendwelche besseren Vorschläge? Würde mich freuen!
Mit freundlichen Grüßen

Mujahiddin
Mujahiddin ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 24.02.2010, 09:00   #2 (permalink)
Stammbenutzer
Megabyte
 
Benutzerbild von faetzminator
 
Registriert seit: 05.01.2007
Beiträge: 2.224
Abgegebene Danke: 4
Erhielt 111 Danke für 111 Beiträge
Baum muss Cloneable (Java Platform SE 6) bzw. deren Methode clone() sinnvoll implementieren. Dann hast du folgenden Einzeiler:
Java Code: Quelltext in neuem Fenster öffnen
1
binaerbaeume.add(binbaum.clone());
__________________
ich bin keine signatur, ich headbang hier nur
faetzminator ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 24.02.2010, 09:02   #3 (permalink)
Benutzer
Byte
 
Registriert seit: 25.09.2009
Beiträge: 38
Abgegebene Danke: 1
Erhielt 2 Danke für 2 Beiträge
du weißt mit newBaum = binbaum; jedes mal dem neuen baum binbaum zu. jetzt ist es egal mit welcher referenz du was änderst, denn alle zeigen auf binbaum. und deswegen siehst du auch bei jedem baum die änderungen und nciht nur beim neustens
punkt21 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 24.02.2010, 09:04   #4 (permalink)
Projektleiter Plugin-System
Team Plugin-System
 
Benutzerbild von Tomate_Salat
 
Registriert seit: 29.01.2009
Beiträge: 1.131
Blog-Einträge: 6
Abgegebene Danke: 28
Erhielt 59 Danke für 59 Beiträge
Zitat: Mujahiddin
Beitrag anzeigen
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
Baum newBaum = new Baum()
newBaum = binbaum;      // binbaum = der Baum, den der Benutzer sieht
binaerbaeume.add(newBaum);
Ich sehe das Problem darin: Du übergibst hier keine Objekte, sondern Instanzen. Wenn ich das richtig sehe, hast du in deinem Binaerbeaume viele Objekte die auf EINE instanz verweisen.

ungetestet
versuchs mal mit
Java Code: Quelltext in neuem Fenster öffnen
1
newBaum = binbaum.clone();

mfg

Tomate_Salat

Edit Ein Clone-Beispiel:
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class MyClass   
    implements Cloneable
{
    private String me;
    
    public MyClass(String str)
    {
        setMe(str);
    }
 
    public void setMe(String me) {
        this.me = me;
    }
 
    public String getMe() {
        return me;
    }
 
    @Override
    protected Object clone() throws CloneNotSupportedException 
    {
        return super.clone();
    }
}

Geändert von Tomate_Salat (24.02.2010 um 09:15 Uhr)
Tomate_Salat ist gerade online  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 24.02.2010, 09:13   #5 (permalink)
Stammbenutzer
Viertel Gigabyte
 
Benutzerbild von 0x7F800000
 
Registriert seit: 22.04.2007
Beiträge: 3.459
Abgegebene Danke: 1
Erhielt 10 Danke für 10 Beiträge
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
Baum newBaum = new Baum()
newBaum = binbaum;      // binbaum = der Baum, den der Benutzer sieht
binaerbaeume.add(newBaum);
Doppelter Unsinn. Kannst genausogut gleich
Java Code: Quelltext in neuem Fenster öffnen
1
2
Baum newBaum = binbaum;
binaerbaeume.add(newBaum);
bzw.
Java Code: Quelltext in neuem Fenster öffnen
1
binaerbaeume.add(binBaum);
hinschreiben, bzw. diese ganze ArrayList komplett wegschmeißen, weil's sinnlos ist, dieselbe Referenz zig mal abzuspeichern.

Zitat:
Und mein Ziel, dadurch ein 'Rückgängig machen (STRG+Z)' zu entwickeln, scheitert.
Mit immutablen Bäumen wäre es am einfachsten: da wird nämlich wirklich jedes mal ein _neuer_ immutabler Baum erzeugt, da macht es schon mehr sinn, jeden einzelnen Abzuspeichern. Zur Implementierung siehe Introduction to algorithms - Google Bücher, das Bild auf der Seite 295 sagt imho alles...

Zitat:
Ich könnte natürlich eine Methode einbauen, mit der ich alle Werte des binbaums ermittle und einen ganz neuen Baum erzeuge, aber wäre das nicht zu kompliziert?
naja, das wäre mit Abstand die einfachste Lösung: einfach alles Klonen. Allerdings wird das enorm viel speicher Fressen, und ist nicht so interessant zu implementieren, auf gut deutsch: es ist langweilig und sinnlos, und da lernt man nix bei^^
Zitat:
Habt ihr irgendwelche besseren Vorschläge?
Wenn du jeder Operation eine inverse Operation zuordnen kannst (add(5) -> remove(5)), dann reicht es ja auch, nur die Operationen in einer Liste abzuspeichern, und bei ctrl+z bzw ctrl+y einfach nur die jeweilige Operation zu wiederholen bzw. rückgängig zu machen, wäre Speichertechnisch am sparsamsten, aber im Unterschied zu den immutablen Bäumen würde der Zugriff auf Vorgängerversionen in O(k) statt O(1) gehen.

Zusammenfassend: bei n elementen, k Operationen, c Kosten für add/delete/etc

clone:
O(n*k) speicherverbrauch,
O(n+c) laufzeit zur erzeugung des nächsten Zustandes
O(1) zugriff auf vorgängerversionen

immutable:
O(n+k*ln(n)) erwarteter speicherverbrauch
O(ln(n)) laufzeit zur erzeugung des nächsten Zustandes
O(1) zugriff auf Vorgängerversionen

chronik abspeichern:
O(n+k) speicherverbrauch
O(c) zur erzeugung des nächsten Zustandes
O(k*c) zugriff auf Vorgängerversionen

so in der Art... da muss man halt selber wissen, was man will...
__________________
aka Andrey

Geändert von 0x7F800000 (24.02.2010 um 09:22 Uhr)
0x7F800000 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 24.02.2010, 09:24   #6 (permalink)
Stammbenutzer
Kilobyte
Themenstarter
 
Registriert seit: 25.12.2009
Beiträge: 121
Abgegebene Danke: 7
Erhielt 6 Danke für 6 Beiträge
Hilft irgendwie nichts.
Der erste binbaum (der leere, der auch beim Ausführen des Programms direkt gespeichert wird), bleibt bei weiteren Veränderungen noch erfolgreich leer.
Der zweite binbaum dann, wenn ich einen Eintrag einfüge, klappt auch. Ab der dritten Veränderung werden alle binbaeume außer der erste leere binbaum mitverändert... Da soll doch mal wer durchblicken...
Ich bin überfragt...
Weiß wer weiter?

Liebe Grüße.

E: sry, hab nur den zweiten Beitrag gelesen als ich das hier schrieb

@ Ox7...
seite 295 is nich dabei aber ich überleg mir das dann mal später noch...

Geändert von Mujahiddin (24.02.2010 um 09:29 Uhr)
Mujahiddin ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 24.02.2010, 10:14   #7 (permalink)
Stammbenutzer
Viertel Gigabyte
 
Benutzerbild von Landei
 
Registriert seit: 06.04.2005
Beiträge: 2.761
Blog-Einträge: 12
Abgegebene Danke: 23
Erhielt 122 Danke für 113 Beiträge
Zitat: 0x7F800000
Beitrag anzeigen
[JAVA]
Mit immutablen Bäumen wäre es am einfachsten: da wird nämlich wirklich jedes mal ein _neuer_ immutabler Baum erzeugt, da macht es schon mehr sinn, jeden einzelnen Abzuspeichern. Zur Implementierung siehe Introduction to algorithms - Google Bücher, das Bild auf der Seite 295 sagt imho alles...
Würde ich auch vorschlagen.
__________________
... oder nimm einfach Scala! Bereit für die eSCALAtion?
Landei ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 24.02.2010, 19:35   #8 (permalink)
Stammbenutzer
Kilobyte
Themenstarter
 
Registriert seit: 25.12.2009
Beiträge: 121
Abgegebene Danke: 7
Erhielt 6 Danke für 6 Beiträge
mit final, super.clone() und beides zusammen probiert, das ist ihm aber egal.
Bei Ausführen des Programms = leerer Baum wird erzeugt.
Bei binbaum.add(new Knoten(blabla)); übernehmen alle Bäume der ArrayList (mit Ausnahme des ersten Baums) die Felder des veränderten Binärbaums.

Heißt:
Ausführen: List<Baum(leer)>;
Add: List<Baum(leer), Baum(addedKnoten)>;
Add: List<Baum(leer), Baum(addedKnoten, newAddedKnoten), Baum(addedKnoten, newAddedKnoten)>; ---- richtig wäre: List<Baum(leer), Baum(addedKnoten), Baum(addedKnoten, newAddedKnoten)>;

Quellcode:
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void baum_add(Data dnew)
{
    binbaum.add(dnew);
    final Baum newbaum = binbaum.clone();
    binaerbaeume.add(newbaum);
} // Im GUI
 
 
protected Baum clone()
{
    try
    {
        return (Baum) super.clone();
    }
    catch(CloneNotSupportedException e)
    {
        System.err.println(e);
        return null;
    }
} // In Baum
Mujahiddin ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 24.02.2010, 19:39   #9 (permalink)
Stammbenutzer
Megabyte
 
Benutzerbild von faetzminator
 
Registriert seit: 05.01.2007
Beiträge: 2.224
Abgegebene Danke: 4
Erhielt 111 Danke für 111 Beiträge
Du musst natürlich die Methode clone() noch implementieren, z.B. so:
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
protected Baum clone() throws CloneNotSupportedException {
    Baum clone = new Baum();
    // danach die Attribute oder was weiss ich
    clone.someInt = this.someInt;
    clone.someString = this.someString; // immutable object, darum einfach zuweisen
    clone.someOtherObject = this.someOtherObject.clone(); // nicht immutable, darum auch dort clone() aufrufen falls eine Veränderung erwartet wird
    // ...
    return clone;
}
__________________
ich bin keine signatur, ich headbang hier nur
faetzminator ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 24.02.2010, 20:38   #10 (permalink)
Stammbenutzer
Kilobyte
Themenstarter
 
Registriert seit: 25.12.2009
Beiträge: 121
Abgegebene Danke: 7
Erhielt 6 Danke für 6 Beiträge
Okay, jetzt klappts, danke schön
Mujahiddin ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Antwort    

Lesezeichen

Latex Maths & Physics Editor ...

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Java Medien Bibiothek Jennifer22 AWT, Swing & SWT 1 15.01.2010 11:13
Jtable Werte ohne Enter übernehmen Enton AWT, Swing & SWT 9 27.10.2009 13:35
Werte in ein Textfeld übernehmen Alex_winf01 AWT, Swing & SWT 4 08.04.2008 16:38
table mit dynamische Werte in Aplet zeichnen leo Deployment 3 30.01.2006 17:05
per Mausklick Werte übernehmen orakeldermacht Java Basics - Anfänger-Themen 2 24.01.2005 23:03


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:13 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de