Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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.:
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
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
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 !
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)
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).
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));
}
}
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.
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
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
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 !
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
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();
Ä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... :/