Problem beim Löschen des ersten Eintrags einer TreeSet

Status
Nicht offen für weitere Antworten.
M

markus1986

Gast
hallo comm,

da ich noch anfänger bin und jetzt an ein problem gestoßen bin, was ich bisher mit keinen mitteln lösen konnte, wende ich mich an euch.

es geht um folgendes:

ich habe eine klasse Pixel:

Code:
public class Pixel implements Comparable<Pixel> {
	private int xx, yy, regionsnummer, differenzi, farbe;
		
	public Pixel(int xKoo, int yKoo, int rnr, int diff, int colour){
		xx = xKoo;
		yy = yKoo;
		regionsnummer = rnr;
		differenzi = diff;
		farbe = colour;
	}
	
	public int getX(){
		return xx;
	}
	
	public int getY(){
		return yy;
	}
	
	public int getDifferenz(){
		return differenzi;
	}
	
	public int getFarbe(){
		return farbe;
	}
	
	public int getRegion(){
		return regionsnummer;
	}
	public static void main(String[] args){
		new Pixel(0, 0, 0, 0, 0);
	}

   public int compareTo(Pixel o) 
   { 
      int diffe = o.getDifferenz()-this.getDifferenz();
      if (diffe != 0) { 
    	  if(diffe > 0) return -1; else return 1;
      } 
      else if(diffe == 0){
    	  if (this.equals(o)) return 0; else return 1;
      }
      else {
    	  return 1;
      }
   } 
}

in der comparable implementiert ist. ich weiß nicht, ob ich die methode compareTo so richtig geschrieben habe, aber sie scheint zu funktionieren.

ich lade ein foto in mein programm und klicke dann beliebige pixel in diesem bild an.
nach jedem klick werden alle nachbarpixel (für jeden wird ein objekt Pixel erstellt) mithilfe folgender methode in einer treeset gespeichert:

Code:
public void nachbarnEinsortieren(int x, int y, int a, int farbe_elter) {
    	
    	int i, j;
    	for(i = -1; i <= 1; i++){
   	 		for(j = -1; j <= 1; j++){
   	 			if((i != 0 || j != 0) && SegImage[x+i][y+j] == -2)
   	 			{
   	 				Color pixel = bild.gibPunktfarbe(x+i, y+j);
   	 				int grau = pixel.getBlue();
   	 				int differenz = Math.abs(farbe_elter-grau);
   	 				sortierteListe.add(new Pixel(x+i, y+j, a, differenz, grau));
   	 			}
   	 		}
   	 	}
	}

die treeset wird deklariert: private TreeSet<Pixel> sortierteListe; und initialisiert: sortierteListe = new TreeSet<Pixel>();

nach einem klick auf einen button wird folgende methode aufgerufen:

Code:
	public void ListeAusgeben(){
		for(Iterator iter = sortierteListe.iterator(); iter.hasNext(); ){
			Pixel wert = (Pixel) iter.next();
			System.out.println(wert);
		}
		int i;
		for(i = 0; i < sortierteListe.size(); i++){
			Pixel wert = (Pixel) sortierteListe.first();
			System.out.println("----");
			System.out.println(wert);
			sortierteListe.remove(sortierteListe.first());
		}
	}

die erste for schleife wird wie erwartet abgearbeitet: ich erhalte also eine liste aller pixelobjekte in der treeset (alle mit versch. hashCodes). bei der zweiten for-schleife erwarte ich, dass er mir immer den ersten eintrag ausgibt, löscht und dann wieder den ersten eintrag nimmt, der natürlich der zweite aus dem vorherigen durchlauf war.
das Problem ist: er löscht den ersten eintrag nicht und ich habe keine ahnung warum!

ich habe schon sehr viel rumgetestet und mir auch ein neues beispiel geschrieben, wo ich eine treeset mit pixelobjekten (meiner pixelklasse) befüllt habe und dann genau wie hier ausgegeben habe, das klappt!

ich weiß echt nicht mehr, was ich noch testen soll .. hat jemand vielleicht eine idee?

grüße
markus
 
M

markus1986

Gast
scheinbar hat keiner von euch eine idee. ich habe jetzt noch weiter getestet. also wenn ich in der methode nachbarnEinsortieren die schleifen jeweils nur 1 durchlaufen lasse werden nur 2 punkte gespeichert. dann klappt das auch mit der ausgabe und dem löschen in der treeset!

was geht da ab??
 
G

Guest

Gast
The natural ordering for a class C is said to be consistent with equals if and only if e1.compareTo(e2) == 0 has the same boolean value as e1.equals(e2) for every e1 and e2 of class C. Note that null is not an instance of any class, and e.compareTo(null) should throw a NullPointerException even though e.equals(null) returns false.

It is strongly recommended (though not required) that natural orderings be consistent with equals. This is so because sorted sets (and sorted maps) without explicit comparators behave "strangely" when they are used with elements (or keys) whose natural ordering is inconsistent with equals. In particular, such a sorted set (or sorted map) violates the general contract for set (or map), which is defined in terms of the equals method.

For example, if one adds two keys a and b such that (!a.equals(b) && a.compareTo(b) == 0) to a sorted set that does not use an explicit comparator, the second add operation returns false (and the size of the sorted set does not increase) because a and b are equivalent from the sorted set's perspective.
 
G

Guest

Gast
Ich habe ein paar Anmerkungen zu Deiner Pixelklasse:

markus1986 hat gesagt.:
Code:
public class Pixel implements Comparable<Pixel> {

// Welchen Sinn hat das main an dieser Stelle?

	public static void main(String[] args){
		new Pixel(0, 0, 0, 0, 0);
	}

   public int compareTo(Pixel o) 
   { 
      int diffe = o.getDifferenz()-this.getDifferenz();

// Hier behandelst Du den Fall, dass die Differenzen verschieden sind
      if (diffe != 0) { 
    	  if(diffe > 0) return -1; else return 1;
      } 

// Falls das else-Statement ausgeführt wird, kann diffe nur 0 sein, das if ist also überflüssig!
      else if(diffe == 0){

// Du hast equals nicht überschrieben, von daher wird auf Identität überprüft. Ist es das, was Du möchtest?
    	  if (this.equals(o)) return 0; else return 1;
      }

// Dieses else kann niemals erreicht werden, da diffe nicht weder gleich 0 noch ungleich 0 sein kann
      else {
    	  return 1;
      }
   } 
}

Ich würde das compareTo so implementieren, zusammen mit equals und hashCode:
Code:
public int compareTo(Pixel p)
{
	final int diffe = differenzi - p.differenzi;
	return (diffe > 0) ? 1 : (diffe < 0) ? -1 : 0;
}

public boolean equals(Object o)
{
	if (!(o instanceof Pixel)) return false;
	Pixel p = (Pixel) o;
	return differenzi == p.differenzi; 
}

public int hashCode()
{
	return differenzi;
}

Wie bereits im dritten Post geschrieben verlangt das compareTo das Überschreiben von equals, und dieses verlangt wiederum das Überschreiben von hashCode. Sonst kannst Du die tollsten Dinge erleben, wenn Du falsch implementierte Objekte in Sets steckst.

nach einem klick auf einen button wird folgende methode aufgerufen:

Code:
public void ListeAusgeben(){
	for(Iterator iter = sortierteListe.iterator(); iter.hasNext(); ){
		Pixel wert = (Pixel) iter.next();
		System.out.println(wert);
	}
	int i;
	for(i = 0; i < sortierteListe.size(); i++){
		Pixel wert = (Pixel) sortierteListe.first();
		System.out.println("----");
		System.out.println(wert);
		sortierteListe.remove(sortierteListe.first());
	}
}

die erste for schleife wird wie erwartet abgearbeitet: ich erhalte also eine liste aller pixelobjekte in der treeset (alle mit versch. hashCodes).
Die Schleife lässt sich deutlich kompakter schreiben:

Code:
for (Pixel p : sortierteListe) System.out.println(p);

Die Schleifenbedingung Deiner zweiten Schleife ist falsch:
Code:
for(i = 0; i < sortierteListe.size(); i++)
Da Du innerhalb der Schleife die Größe der sortierten Liste durch das Löschen änderst, brichst Du zu früh ab und erwischst nicht alle Elemente. Falls die Liste am Anfang acht Elemente enthält, wirst Du so nur vier Elemente bearbeiten, danach ist die Schleife zu Ende (weil Du vier Elemente von den acht gelöscht hast ist die Liste nur noch vier Elemente gross, also sind wir fertig).

bei der zweiten for-schleife erwarte ich, dass er mir immer den ersten eintrag ausgibt, löscht und dann wieder den ersten eintrag nimmt, der natürlich der zweite aus dem vorherigen durchlauf war.
das Problem ist: er löscht den ersten eintrag nicht und ich habe keine ahnung warum!
Liegt wahrscheinlich an der falschen Implementierung von Comparable.

Es sollen also letzten Endes alle Pixel aus der Liste gelöscht werden? Warum iterierst Du dann nicht einfach ganz normale über die Liste und machst irgendwas mit Deinen Pixel, und wenn Du dann mit Deiner Schleife fertig bist, löschst Du die Liste:

Code:
for (Pixel p : sortierteListe)
{
    System.out.println("----");
    System.out.println(p);
}
sortierteListe.clear();

Müsste doch eigentlich genau das sein, was Du brauchst, oder? Gib mal Bescheid, ob es funktioniert.


Fred
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Problem beim Löschen von elementen aus einer ArrayList Java Basics - Anfänger-Themen 5
E BlockChallenge: Problem beim löschen der Blöcke Java Basics - Anfänger-Themen 3
S Problem beim löschen einer Zeile aus einer Tabelle Java Basics - Anfänger-Themen 4
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0
C Methoden Problem beim Speichern von Variablen Java Basics - Anfänger-Themen 1
F Problem beim entfernen von mehreren Listenelementen auf einmal (Programmierung des Spiels Arschloch) Java Basics - Anfänger-Themen 1
B Problem beim grundsätzlichen Verständnis bei Rekursion mit 2-dimensionalen Array Java Basics - Anfänger-Themen 6
E Datentypen Problem beim Speichern von enum. Java Basics - Anfänger-Themen 10
A Problem beim Deklarieren von einem BOOLEAN Java Basics - Anfänger-Themen 4
B Gleicher Prozess starten und stoppen (Problem beim Stoppen) Java Basics - Anfänger-Themen 5
DestinatioN Problem beim splitten eines Satzes in Wörter und die Wörter in Buchstaben Java Basics - Anfänger-Themen 2
B Problem beim Angeben einer Eingabe Java Basics - Anfänger-Themen 12
J Encoding Problem beim Einlesen einer txt Datei mit Umlauten Java Basics - Anfänger-Themen 3
R Problem beim Wochenplan (Datum,Wochentag) Java Basics - Anfänger-Themen 30
D Problem beim umwandeln eines Strings in eine Dzezimalzahl Java Basics - Anfänger-Themen 6
A Compiler-Fehler Problem beim einbinden der applet Klasse Java Basics - Anfänger-Themen 2
L Compiler-Fehler Problem beim Programmieren eines Kalenders (java.lang.ArrayIndexOutOfBoundsException) Java Basics - Anfänger-Themen 2
C Problem beim laden eines BufferedImage Java Basics - Anfänger-Themen 2
D Problem beim Lesen einer txt-Datei Java Basics - Anfänger-Themen 8
fLooojava Bluetooth Projekt - Problem beim mehrmaligen Senden Java Basics - Anfänger-Themen 5
E Problem beim Übergeben von Parameter an Methode Java Basics - Anfänger-Themen 2
Z Problem beim Lesen und Schreiben einer Datei Java Basics - Anfänger-Themen 10
R Problem beim erstellen eines neuen Klassenobjekts Java Basics - Anfänger-Themen 2
F Input/Output Problem beim einlesen eines Strings Java Basics - Anfänger-Themen 3
J Problem beim auslesen von Int Wert aus YML-Datei Java Basics - Anfänger-Themen 6
P Problem beim Abschluss im Kompositum Java Basics - Anfänger-Themen 3
M Problem mit null pinterexception beim laden von Bildern Java Basics - Anfänger-Themen 20
K Problem beim Array aufruf Java Basics - Anfänger-Themen 4
J Problem beim ausführen in cmd.exe Java Basics - Anfänger-Themen 4
J Variablen Problem beim einlesen einer Zahl Java Basics - Anfänger-Themen 7
A Problem beim Compilieren Java Basics - Anfänger-Themen 11
J Problem beim Fenster Java Basics - Anfänger-Themen 4
tux20 Problem beim Schreiben von List to File Java Basics - Anfänger-Themen 2
M Problem beim Compilieren Java Basics - Anfänger-Themen 14
Maxim6394 Problem beim Abspielen von Sounds Java Basics - Anfänger-Themen 8
S Problem beim ersten compilieren überhaubt Java Basics - Anfänger-Themen 43
H Problem beim lesen des InputStreams von einem Subprozess Java Basics - Anfänger-Themen 4
Luk10 Problem beim .jar Datei erstellen Java Basics - Anfänger-Themen 19
L Problem beim Ausführen Java Basics - Anfänger-Themen 40
A Problem beim einfügen in eine Datenbank Java Basics - Anfänger-Themen 2
E Problem beim Programmieren eines Kartenspiels Java Basics - Anfänger-Themen 3
A Problem beim Ausführen einer .jar datei auf externen System Java Basics - Anfänger-Themen 5
M Problem beim compilieren Java Basics - Anfänger-Themen 6
JAVAnnik problem beim lvl laden Java Basics - Anfänger-Themen 15
L Problem beim Einlesen einer Datei in einen String Java Basics - Anfänger-Themen 12
W Problem beim erstellen eines Tests Java Basics - Anfänger-Themen 16
JAVAnnik Problem beim Objekt bewegen Java Basics - Anfänger-Themen 20
A Erstes Programm - Problem beim Ausführen als jar Java Basics - Anfänger-Themen 3
S Problem beim Speichern und Laden von Daten Java Basics - Anfänger-Themen 13
B Problem beim Abspielen einer Videodatei Java Basics - Anfänger-Themen 4
S Problem beim Erstellen eines Scanner-Objekts Java Basics - Anfänger-Themen 7
W Problem beim CSV-Import Java Basics - Anfänger-Themen 5
M Datentypen Problem beim zusammenstellen eines Abfrage-Strings Java Basics - Anfänger-Themen 3
K Collections Problem beim import von Packages Java Basics - Anfänger-Themen 10
S Problem beim Kompilieren - cannot find symbol - constructor() Java Basics - Anfänger-Themen 12
B Problem beim Email versenden mit Javamail Java Basics - Anfänger-Themen 5
H Problem beim Anfang von Java (Java Editor) Java Basics - Anfänger-Themen 2
I Problem beim Schreiben eines ersten Programms Java Basics - Anfänger-Themen 3
D Problem beim Zeichnen von "Das Haus vom Nikolaus" Java Basics - Anfänger-Themen 10
D Problem beim Auslesen aus File Java Basics - Anfänger-Themen 3
A Problem beim Splitten eines Strings Java Basics - Anfänger-Themen 10
S Problem mit ObjectInputStream beim Einlesen von LinkedList Java Basics - Anfänger-Themen 3
V Problem beim Programm laden Java Basics - Anfänger-Themen 5
H Problem beim kompilieren Java Basics - Anfänger-Themen 3
C ActionListener problem beim starten von programmen Java Basics - Anfänger-Themen 3
4 OOP Problem beim Speichern verschiedener Klassen in verschiedenen Dateien Java Basics - Anfänger-Themen 25
T Problem beim Returnwert einer Methode Java Basics - Anfänger-Themen 12
M line.separator: Problem beim Lesen einer Datei Java Basics - Anfänger-Themen 11
Miladriel Problem beim Neuzeichnen nach deiconify Java Basics - Anfänger-Themen 9
R Problem beim Ausführen von Java-PGM aus der shel Java Basics - Anfänger-Themen 3
G Problem beim Sortieren einer Liste Java Basics - Anfänger-Themen 20
M Problem beim Ereignishandling mit Menü Java Basics - Anfänger-Themen 2
H problem beim zeichen im JFrame Java Basics - Anfänger-Themen 6
F Problem beim Objekteaufruf... Java Basics - Anfänger-Themen 4
H Problem beim Verkürzen von Programm Java Basics - Anfänger-Themen 3
T Problem beim Werfen und Fangen von Exceptions Java Basics - Anfänger-Themen 2
M Problem beim Zugriff auf Daten GUI + Startklasse Java Basics - Anfänger-Themen 4
P Problem beim Thread Java Basics - Anfänger-Themen 20
0 problem beim Polygon zeichnen Java Basics - Anfänger-Themen 3
V Problem beim erstellen eines ausführbaren Programs Java Basics - Anfänger-Themen 5
0 Problem beim Starten des Applets Java Basics - Anfänger-Themen 2
N Problem beim Durchsuchen einer LinkedList Java Basics - Anfänger-Themen 5
G Problem beim Programmieren von Blackjack Java Basics - Anfänger-Themen 15
R Problem beim Laden eines Images Java Basics - Anfänger-Themen 7
K Problem beim installieren des JDK 1.6+ version Java Basics - Anfänger-Themen 3
T Problem beim Konsolenstart Java Basics - Anfänger-Themen 5
C Problem beim Berechnen der Quadratwurzel Java Basics - Anfänger-Themen 3
C Problem beim nutzen von Teilprogrammen in main Java Basics - Anfänger-Themen 2
M Problem beim Zeichnen Java Basics - Anfänger-Themen 5
D Problem beim Kompilieren Java Basics - Anfänger-Themen 4
D Problem beim auslesen von TextArea Java Basics - Anfänger-Themen 3
G Problem beim Schreiben in Textdatei Java Basics - Anfänger-Themen 9
F ggT finden - problem beim qc Java Basics - Anfänger-Themen 4
S Problem mit url, inputStream und bytes beim Quellcode laden. Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben