TreeSet methode Remove

Status
Nicht offen für weitere Antworten.
J

jürgen I.

Gast
hallo.
ich versuche einen sweepLine Algorithmus zu programmieren um rechteckschnitte zu erfahren.
dafür benutze ich den ADT TreeSet mit einem von mir erstellten Klasse ListElem

ich habe ein TreeSet von dem aus die aktuell benutzen Rechtecke in ein 2 Treeset(yList) kopiert werden.
und zu einem späteren Zeitpunkt sollen die Elemete aus der yList entfernt werden wenn es sich um ein ListenElement das die selbe Eigenschaft (obj) wie "e" hat. die erklärung ist nicht so gut aber mit dem code wird es hoffentlich klar.:


for(ListElem del : yList) {
if(del.obj == (e.obj)) {
//System.out.println(del.obj == e.obj);
System.out.println(yList.remove(del));
}
}

die auskommentierte Zeile zeigt mir das die zu löschenden ListElem richtig herausgesucht werden. das remove liefert aber false(also das obj ist nicht enthalten). Typecast ist nicht nötig habe ich aber auch schon probiert ^^.
weiß jemand wo der fehler liegen könnte?
danke im vorraus
Jürgen
 

norman

Top Contributor
wenn dein ListElem von einer Liste in eine andere kopiert wird, dann wird liste1.elem == liste2.elem immer false sein.

was du willst ist
Code:
if (del.obj.equals(e.obj)) { //...
 
J

jürgen i

Gast
hallo norman.
danke für die schnelle antwort.
die elemente werden aber nicht aus einer zweiten liste kopiert. es werden neue erstellt aber die vergleiche der .obj ist richtig, geht mit == und auch mit equals. wie gesagt die identifizierung der richtigen elemte gelingt, bei dem befehl remove stellt es sich aber quer
 
B

bygones

Gast
dass == immer geht bezweifle ich... equals ist schon richtig und sollte verwendet werden.

das remove klappt nicht weil er das objekt del nicht in der liste findet. Es wird ueber equals verglichen, wenn du die methode nicht ueberschrieben hast wird das equals aus Object genommen und das vergleich nicht auf inhaltliche gleichheit !
 
J

jürgen i

Gast
hallo,
wie gesagt an dem if liegt es nicht. das er del nicht findet scheint mir ein bischen suspekt, gehe ich mit der for schleife doch alle elemente der liste durch.
hier mal ein krasses beispiel. bei jedem durchlauf der schleife sollte er ja die komplette TreeSet löschen, aber es passiert gar nichts.( die anzahl der ausgegeben "gefunden" ist richtig)

Code:
				for(ListElem del : yList) {
					yList.remove(del);
					if(del.obj.equals(e.obj)) {
						System.out.println("gefunden");
					}
				}
 
B

bygones

Gast
nochmal.

API hat gesagt.:
boolean remove(Object o)

More formally, removes an element e such that (o==null ? e==null : o.equals(e)), if this collection contains one or more such elements. Returns true if this collection contained the specified element (or equivalently, if this collection changed as a result of the call).

wenn deine Elemente kein equals implementieren wirst du nciht weit kommen !
 

NTB

Bekanntes Mitglied
Ich hab Dir mal ein Beispiel gebaut. Um TreeSet.contains() zu benutzen, musste ich Comparable implementieren. Die Methoden sind so natürlich nicht ausgeführt und dienen nur exakt diesem Zweck: Dir zu zeigen, dass Du so nicht weiterkommst.
Probier es aus!

/Tante Edit: Also einmal so wie es hier ist starten. Und dann die Equals-Methode einkommentieren und starten.
Und dann hier im Forum schreiben: "Uppsala, ich hätte gleich auf Euch Javagurus hören sollen" :)

Code:
import java.util.TreeSet;


public class Equalities implements Comparable<Equalities> {

    private String a;
    private int b;
    
    public int getB() {
        return b;
    }
    public void setB(int b) {
        this.b = b;
    }
    public String getA() {
        return a;
    }
    public void setA(String a) {
        this.a = a;
    }

    public int compareTo(Equalities o) {
        return 0;
    }
    
//    public boolean equals(Object obj) {
//        return true;
//    }

    public int hashCode() {
        return 0;
    }
    
    public static void main(String[] args) {
        Equalities foo = new Equalities();
        foo.setA("Hello World");
        foo.setB(42);

        Equalities del = new Equalities();
        del.setA("Hello World");
        del.setB(42);
        
        TreeSet<Equalities> ts = new TreeSet<Equalities>();
        ts.add(foo);

        System.out.println(ts.contains(foo));
        
        for (Equalities eq : ts) {
            if (eq==del) {
                ts.remove(eq);
            }
            if (eq.equals(del)) {
                ts.remove(eq);
            }
        }

        System.out.println(ts);
        
        System.out.println(ts.contains(foo));
    }
}
 
G

Guest

Gast
hi,
danke deathbyaclown für die antwort. nochmal kurz, es geht noch nicht.
Ich habe equals so implementiert, die ursprüngliche methode von Object wird überschrieben.

Code:
	public boolean equals(Object le) {
		System.out.println("check");
		if(this.type.equals(((ListElem) le).type)){
			System.out.println("T");
			return true;
		}
		else return false;
	}

ein kleiner Test
Code:
	        TreeSet<ListElem> ts = new TreeSet<ListElem>();
		ListElem a = new ListElem(100,0,null);
		ts.add(a);
		for (ListElem del : ts)
			System.out.println(ts.remove(del));
		ListElem b = new ListElem(100,2,null);
		ts.add(b);	
		System.out.println(ts.remove(b));

hat die ausgabe:
true
true

also scheint es da zu gehen, aber die Ausgabe "check" und "T" fehlen. trotzdem schmeißt er a raus.
ich muss später nochmal reinschauen, oder versuchen das ganze mit einem anderem ADT zu machen wenn es immernoch nicht klappt
 
B

bygones

Gast
NTB hat gesagt.:
IUnd dann hier im Forum schreiben: "Uppsala, ich hätte gleich auf Euch Javagurus hören sollen" :)
aha... und dann eine hashcode methode schreiben die immer 0 zurueckgibt....

was mich wundert ist dass er ueberhaupt deine for schleife durchgeht. du aenderst waeren eines schleifenlaufs das set, das muss bzw tut es auch, eine java.util.ConcurrentModificationException werfen !

ein bsp um zu zeigen dass es geht

Code:
public class TestClass implements Comparable<TestClass> {
    private int number;

    public TestClass(int n) {
        number = n;
    }

    public int compareTo(TestClass o) {
        return number - o.number;
    }

    public boolean equals(Object o) {
        if (o != null && o instanceof TestClass) {
            return ((TestClass) o).number == number;
        }
        return false;
    }

    public String toString() {
        return "NUMBER" + number;
    }

    public static void fehler() {
        TreeSet<TestClass> t = new TreeSet<TestClass>();
        for (int i = 1; i <= 10; i++) {
            t.add(new TestClass(i));
        }
        System.out.println(t);
        for (TestClass tt : t) {
            t.remove(tt);
        }

        System.out.println(t);
    }

    public static void geht() {
        TreeSet<TestClass> t = new TreeSet<TestClass>();
        for (int i = 1; i <= 10; i++) {
            t.add(new TestClass(i));
        }
        System.out.println(t);
        t.remove(new TestClass(6));

        System.out.println(t);
    }

    public static void main(String[] args) {
        geht();
        fehler();
    }
}
methode geht loescht das element, methode fehler schmeisst eine excpetion weil im schleifen durchlauf das set geandert wird
 

NTB

Bekanntes Mitglied
deathbyaclown hat gesagt.:
NTB hat gesagt.:
IUnd dann hier im Forum schreiben: "Uppsala, ich hätte gleich auf Euch Javagurus hören sollen" :)
aha... und dann eine hashcode methode schreiben die immer 0 zurueckgibt....
He moment mal! Du hast gar nicht über die equals und die compareTo Methoden gemeckert! :)

was mich wundert ist dass er ueberhaupt deine for schleife durchgeht. du aenderst waeren eines schleifenlaufs das set, das muss bzw tut es auch, eine java.util.ConcurrentModificationException werfen !
Weil nur ein Element drin ist.
 
J

jürgen i

Gast
Hallo ihr beiden,
danke für eure hilfe. es klappt. ^^
unterschiedene an eurem Code und meinem war das mein Listelem nur Comparable und nicht Comparable<ListElem> hatte. so hab ich dann die benötigte methode direkt von dem Comparator übernommen. und da steckte auch der fehler, das nämlich nie eine 0 zurückgegeben wird. für das einfügen vorher war das so richtig, klappt aber jetzt wohl auch noch richtig.
komisch finde ich aber das er ja die compare Methode vom Comparator auruft und nicht die vom ListElem. naja obwohl das geht noch. richtig beuruhigend finde ich aber, das er fürs löschen den vergleich macht(und der läuft ja über werte die bei zwei verschiedenen objekte wirklich gleich sein können) und nicht über das equals.
wie auch immer. um das vorzubeugen gehe ich ja die schleife durch, die ConcurrentException habe ich durchs merken der zu löschenden objekte und löschen nacher gelöst. bin ja auch ein kleiner guru, aber auf soein problem bin ich noch nicht gestoßen. aber man lernt ja nie aus.
grüßen Jürgen
 
J

jürgen i

Gast
hi. wenn ich schonmal die aufmerksamkeit von 2 experten habe die auch grad in der materie sind.
wie bekomme ich einen Teilbaum der unabhängig von derm ursprünglichen ist(daher löschen aus dem Teil bewirkt kein löschen im ursprünglichen).
ich hab zwar schon eine alternative die ohne löschen klappt, aber es müsste doch auch einfacher geher als, alle elemente einzeln in einen zweiten baum kopieren(hab ich aber auch noch nicht ausprobiert)

Code:
TreeSet<ListElem> sub = (TreeSet)((TreeSet) yList.subSet(in,out)).clone();

geht auch nicht.
viele grüße jürgen
 

NTB

Bekanntes Mitglied
Äh, also weil ihr da so rumreitet: Hinter dem Satz mit den Gurus war ganz absichtlich ein Smiley. Ich würde mich nie ernsthaft als Javaguru bezeichnen.

ja äh, ich hätte den gleichen Vorschlag zum Teilbaum gemacht... :/
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Laufzeit/ O/Θ-Notation einer Treeset Methode Java Basics - Anfänger-Themen 0
B Objete von Polygon mit TreeSet verwalten Java Basics - Anfänger-Themen 1
N Einzelne Werte aus einem TreeSet auslesen Java Basics - Anfänger-Themen 2
R TreeSet Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 8
J Klassen HashSet, TreeSet: unregelmäßige Zahlenreihen beim Befüllen Java Basics - Anfänger-Themen 7
J Objecte in TreeSet einfügen klappt nicht Java Basics - Anfänger-Themen 5
J TreeSet mit compareTo sortieren Java Basics - Anfänger-Themen 2
W Add zu TreeSet Probleme Java Basics - Anfänger-Themen 6
T TreeSet sortiert in ein anderes kopieren Java Basics - Anfänger-Themen 2
Todesbote Treeset - Wenn bestimmtes Objekt vorkommt Counter erhöhen Java Basics - Anfänger-Themen 6
Todesbote Map<String, Treeset> aus Treeset bestimmten Wert auslesen Java Basics - Anfänger-Themen 4
A Treeset per For-Schleife durchlaufen Java Basics - Anfänger-Themen 2
U TreeSet und Komparatoren Java Basics - Anfänger-Themen 6
B Object "Method" in TreeSet, Fehler beim Vergleichen/Comparable Java Basics - Anfänger-Themen 9
B Lotto mittels TreeSet Java Basics - Anfänger-Themen 3
D Datentypen TreeSet aus einer List<String[]> befüllen Java Basics - Anfänger-Themen 18
M Treeset sortieren und ausgeben Java Basics - Anfänger-Themen 17
K TreeSet Sortieren Java Basics - Anfänger-Themen 6
E TreeSet Element löschen Java Basics - Anfänger-Themen 9
T treeSet durchsuchen Java Basics - Anfänger-Themen 2
R Sortieren TreeSet Java Basics - Anfänger-Themen 2
G HashSet vs. TreeSet Java Basics - Anfänger-Themen 3
M Problem beim Löschen des ersten Eintrags einer TreeSet Java Basics - Anfänger-Themen 3
M TreeSet sortieren Java Basics - Anfänger-Themen 13
C Maximal-Anzahl von Objekten in TreeSet Java Basics - Anfänger-Themen 7
S TreeSet und StringTokenizer Java Basics - Anfänger-Themen 6
T Verschiedene Optionen in der Methode Java Basics - Anfänger-Themen 6
T Rekursive Methode Java Basics - Anfänger-Themen 13
Ü Methode soll Quadrat aus der Summer zurückgeben Java Basics - Anfänger-Themen 10
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
Leyla Spezifischte Methode Java Basics - Anfänger-Themen 16
M Methode zielnah zeigt das gewünschte Ausgabe nicht an Java Basics - Anfänger-Themen 3
L Variablenwerte aus einer Methode übergeben Java Basics - Anfänger-Themen 2
T Methode soll etwas ausrechnen und zurückgeben (klappt nd) hat wer eine Idee? Java Basics - Anfänger-Themen 11
P Main Methode scheint Constructor aufzurufen, ohne dass es so gecoded ist Java Basics - Anfänger-Themen 2
T Aufruf der Methode einer Oberklasse, wenn sie in der Unterklasse überschrieben ist. Polymorphie. Java Basics - Anfänger-Themen 2
C Zugriff auf Methode Java Basics - Anfänger-Themen 2
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
M Methode sperren bis ein Kriterium erfüllt wurde Java Basics - Anfänger-Themen 3
D Switch Case Methode aufrufen Java Basics - Anfänger-Themen 3
C Unbekannte Methode add bei Klasse die JTree erweitert Java Basics - Anfänger-Themen 14
M methode aufrufen ohne parameter Java Basics - Anfänger-Themen 1
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
monsterherz einfache Methode mit Fehler den ich nicht finde Java Basics - Anfänger-Themen 21
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
G Variable aktualisiert sich nicht in rekursiver Methode Java Basics - Anfänger-Themen 4
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
Say super.methode / super.variable und super(variable) Java Basics - Anfänger-Themen 2
B Wie kann ich folgende Klasse/Methode per Button ausführen? Java Basics - Anfänger-Themen 1
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
L Methoden Eine Methode um zu testen ob es ein Nachbar gibt Java Basics - Anfänger-Themen 10
til237 Iterative Methode in rekursive Methode umschreiben Java Basics - Anfänger-Themen 4
M Daten aus errechneter Methode in Datenbank(SQLite) schreiben Java Basics - Anfänger-Themen 60
D next() Methode mehrfach verwenden Java Basics - Anfänger-Themen 1
Ostkreuz Methoden Von Dezimal zu Hexadezimal Methode toHex Java Basics - Anfänger-Themen 2
I Entity Objekt nicht gefunden -> Webhook empfangen in der gleichen Methode (Transaktion) Java Basics - Anfänger-Themen 37
N Throw an Main Methode übergeben Java Basics - Anfänger-Themen 7
M Methoden Methode 'wiederhole' nicht gefunden (Uebersetzungsfehler) Java Basics - Anfänger-Themen 1
H Zu langen String aufteilen - bequeme Methode? Java Basics - Anfänger-Themen 14
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
S Array mit Methode löschen Java Basics - Anfänger-Themen 2
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
T Variable von Objekten in einer Methode überprüfen Java Basics - Anfänger-Themen 26
M Anzahl Kommandozeilenparamter mittels Methode Java Basics - Anfänger-Themen 11
D Methode: Array Reihenfolge tauschen Java Basics - Anfänger-Themen 3
julian0507 Array aus Methode in anderer Methode sichtbar machen Java Basics - Anfänger-Themen 10
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
J Die statische Main-Methode ändert Instanzvariable? Java Basics - Anfänger-Themen 10
D Methode aus dem Aufrufer aufrufen Java Basics - Anfänger-Themen 1
T IOStreams read(byte[]b) methode Java Basics - Anfänger-Themen 2
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
D Warum kann ich hier nicht auf die Methode zugreifen? Java Basics - Anfänger-Themen 5
M generate Methode für Streams Java Basics - Anfänger-Themen 6
M Methoden Zweidimensionaler Array mit Setter Methode ändern Java Basics - Anfänger-Themen 4
I Optionaler Parameter bei Methode, der nur optional ist? Java Basics - Anfänger-Themen 6
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
T Linked List set-Methode Java Basics - Anfänger-Themen 2
D Arrays an replaceAll-Methode übergeben Java Basics - Anfänger-Themen 12
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
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
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
W Equals-Methode überschreiben bei composition Java Basics - Anfänger-Themen 20
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
T Methode, die prüft ob in einem Int-Array maximal 2 Zahlen enthalten sind, die größer als ihr Vorgänger sind Java Basics - Anfänger-Themen 5
V Methoden printChar Methode mit Rückgabetyp void Java Basics - Anfänger-Themen 26
F Graph Tiefensuche Methode Java Basics - Anfänger-Themen 7
Jambolo Methode, welche die 3 letzten Parameter Werte speichert Java Basics - Anfänger-Themen 20
berserkerdq2 wie funktioniert contenthandler, was muss ich bei der Methode startElement und endElement tun? Java Basics - Anfänger-Themen 11
M Warum return die Methode den Wert nicht Java Basics - Anfänger-Themen 5
berserkerdq2 Wann soll ich den Stream schließen, wenn ich das in einer Methode habe? Java Basics - Anfänger-Themen 8
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
S Methode Java Basics - Anfänger-Themen 4
M Eine Methode die erkennt ob die ein gegebene zahl größer oder kleiner sein muss Java Basics - Anfänger-Themen 2
U Methode wird genutzt, ohne dass ich die aufrufe? Java Basics - Anfänger-Themen 4
F nach Methode Programm nicht beenden Java Basics - Anfänger-Themen 9
Liroyd Methode mit Objektvariabel rechnen? Java Basics - Anfänger-Themen 6
H Mit setter-Methode JLabel in einer andern Klasse ändern. Java Basics - Anfänger-Themen 40
D Methode um mögliche Rezepte auszugeben Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben