HashMap key wird nicht erkannt trotz überschriebener equals/hashCode Methode

Ikaron

Bekanntes Mitglied
Naja, der Titel beschreibt mein Problem ja schon :)
Ich habe folgende Klasse zum Splitten eines Images:

Java:
package lib.util;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

import javax.imageio.ImageIO;

public class GridImage {

	private BufferedImage mainImage;
	private int gridWidth, gridHeight, gridMaxX, gridMaxY;

	private HashMap<Point2D, BufferedImage> imgs = new HashMap<Point2D, BufferedImage>();
	private HashMap<String, Point2D> aliases = new HashMap<String, Point2D>();

	public GridImage(String s, int gridWidth, int gridHeight) {

		try {
			mainImage = ImageIO.read(new File(s));
		} catch (IOException e) {

			e.printStackTrace();
		}

		this.gridWidth = gridWidth;
		this.gridHeight = gridHeight;
		this.gridMaxX = mainImage.getWidth() / gridWidth;
		this.gridMaxY = mainImage.getHeight() / gridHeight;
	}
	
	public void addSplit(Point2D c1, Point2D c2) {

		addSplit(c1.x(), c1.y(), (short) (c2.x() - c1.x()), (short) (c2.y() - c1.y()));
	}
	
	public void addSplit(short x, short y, short w, short h) {

		if (x >= 0 && y >= 0 && (x + w < gridMaxX) && (y + h < gridMaxY))
			imgs.put(
					new Point2D(x, y),
					ImageHelper.cropImage(mainImage, x * gridWidth, y
							* gridHeight, w * gridWidth, h * gridHeight));
	}

	public void addAlias(Point2D c, String s) {

		aliases.put(s, c);
	}

	public ArrayList<Point2D> getCoords() {
		
		ArrayList<Point2D> aliases = new ArrayList<Point2D>();

		Iterator<Entry<Point2D, BufferedImage>> it = this.imgs.entrySet().iterator();
		
		while (it.hasNext()) {
			
			aliases.add(it.next().getKey());
		}
	    
		return aliases;
	}

	public ArrayList<String> getAliases() {
		
		ArrayList<String> aliases = new ArrayList<String>();

		Iterator<Entry<String, Point2D>> it = this.aliases.entrySet().iterator();
		
		while (it.hasNext()) {
			
			aliases.add(it.next().getKey());
		}
	    
		return aliases;
	}

	public BufferedImage getImage(String s) {

		return imgs.get(aliases.get(s));
	}

	public BufferedImage getImage(Point2D c) {

		return imgs.get(c);
	}
}

Wie man sehen kann benutze is Point2D, aber nicht diese java.geom (Oder wo auch immer die ist) sondern meine eigene. Ich hab equals and hashCode überschrieben, trotzdem:
new Point2D(0, 0) == new Point2D(0, 0) ist false, obwohl new Point2D(0, 0).equals(new Point2D(0, 0)) true ist.
Hier ist Point2D:

Java:
package lib.util;

public class Point2D {

	private short x, y;

	public Point2D(int x2, int y2) {

		x = (short) x2;
		y = (short) y2;
	}

	public short x() {

		return x;
	}

	public short y() {

		return y;
	}

	public boolean equals(Object o) {

		if (this == o)
			return true;

		if (!(o.getClass().equals(Point2D.class)))
			return false;

		Point2D c = (Point2D) o;

		return c.x == x && c.y == y;
	}
	
	public int hashCode() {
		
		return x + (y << 32);
	}

	public String toString() {

		return "lib.util.Point2D[" + x + "; " + y + "]";
	}
}

Danke für jede Hilfe.
Ikaron

@Edit: Ich dachte ich wär in nem englischen Forum xD
 
Zuletzt bearbeitet:
G

Gast2

Gast
Java:
new Point2D(0, 0) == new Point2D(0, 0)
Die Anweisung kann nie und niemals true werden.
Code:
==
vergleicht ob die Instanzen identisch sind, equals prüft ob die Instanzen die gleichen sind (das bestimmst du selber durch deine equals Methode).

Wenn du also deine Objekte vergleichen willst, dann musst immer equals nutzen.
 

Ikaron

Bekanntes Mitglied
Richtig, das Problem ist jetzt, dass HashMap intern anscheinend auch == verwendet, was mir dann in die Quere kommt. Wenn dies so ist, wie kann ich eine HashMap mit Koordinaten machen, ohne sowas wie HashMap<Integer, HashMap<Integer, E>> zu verwenden?
 
G

Gast2

Gast
HashMap verwendet intern erstmal die Methode hashCode um den richtigen "Topf" für den Eintrag zu finden. Liegen in dem Topf schon Key-Value Paare drin wird per equals verglichen ob die Einträge gleich sind, nicht per
Code:
==
.
Selbiges gilt für das rausholen der Einträge. Auch da wird zunächst equals und danach equals verwendet.

Wo genau ist da jetzt dein Problem?
 

Ikaron

Bekanntes Mitglied
Nun ja, wenn ich etwas einspeichere, zum Beispiel in dem Fall ein BufferedImage, gibt er mir bei Größe 1 zurück (Klar), Wenn ich aber mit new Point2D(0, 0) drauf zugreifen möchte, wird null zurückgegeben, obwohl das Image auch mit new Point2D(0, 0) gespeichert wurde.
 
G

Gast2

Gast
Dann passt da was mit deiner Point2D Klasse nicht. Wobei das equals ganz gut ausschaut. Aber die HashMap nutzt definitiv die equals Methode:

Java:
	public static void main(String[] args) throws Exception {
		HashMap<Key, String> map = new HashMap<Key, String>();
		map.put(new Key(1), "foo");
		map.put(new Key(2), "bar");
		
		System.out.println(map.get(new Key(1)));
	}
	
	private static class Key {
		private final int i;

		public Key(int i) {
			this.i = i;
		}
		
		@Override
		public boolean equals(Object obj) {
			return i == ((Key)obj).i;
		}

		@Override
		public int hashCode() {
			return 42;
		}
	}
 

Ikaron

Bekanntes Mitglied
Hmm... Anscheinend liegt das Problem da, dass meine render()-Methode nicht aufgerufen wird... Ich guck mir das nochmal an...

@Edit: Och neee... Mist, ich bin echt dumm :lol:
Das lag daran, dass ich in meiner bib etwas namens "setInit()" eingebaut hab.. Das hab ich dann aber vergessen, und das ist jetzt das 3te mal, dass es deshalb nicht get :oops:
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
T HashMap values Bearbeitung Allgemeine Java-Themen 4
T Hashmap Values Bearbeitung Allgemeine Java-Themen 1
JavaJakob22 Bestimmte HashMap importieren Allgemeine Java-Themen 4
killig HashMap mit if-Anweisung überprüfen Allgemeine Java-Themen 4
killig Textdatei einlesen und in HashMap speichern (duplikate entfernen) Allgemeine Java-Themen 12
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
L HashMap Allgemeine Java-Themen 10
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
B HashMap Duplikate Allgemeine Java-Themen 4
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
W Array vs. ArrayList vs. HashMap Allgemeine Java-Themen 20
F Tabelle aus CSV, 2 dimensionale HashMap? Allgemeine Java-Themen 4
D Mit Java PHP hashmap lesen Allgemeine Java-Themen 1
H Swing HashMap zu Tabelle macht mir Probleme Allgemeine Java-Themen 4
B HashMap aus Value Key bekommen Allgemeine Java-Themen 2
N HashMap und Methoden richtig einbinden Allgemeine Java-Themen 2
J Problem bei Hashmap Key-Abfrage Allgemeine Java-Themen 4
X JSONObject auslesen und in HashMap hinterlegen Allgemeine Java-Themen 16
N Werte aus Hashmap auslesen und übertragen Allgemeine Java-Themen 8
JavaWolf165 JsonObject in HashMap umwandeln Allgemeine Java-Themen 16
R ArrayList und HashMap Allgemeine Java-Themen 7
L Assoziatives Datenfeld, schneller wie Hashmap Allgemeine Java-Themen 35
G Methoden HashMap speichert unter falschen Schlüsseln Allgemeine Java-Themen 6
D Verschachtelte HashMap initializieren Allgemeine Java-Themen 1
L Variablen HashMap nimmt value nicht an Allgemeine Java-Themen 3
R Hierarchie mit HashMap darstellen Allgemeine Java-Themen 19
D Datentypen HashCollision in HashMap Allgemeine Java-Themen 3
Z Concurrent Modification Exception - HashMap (kein remove) Allgemeine Java-Themen 4
B Zugriff auf eine HashMap Allgemeine Java-Themen 4
B Userdaten in Hashmap speichern - Servlet Allgemeine Java-Themen 6
T Hashmap mit geordneter/ungeordneter liste als Value Allgemeine Java-Themen 5
M Füllfaktor einer Hashmap Allgemeine Java-Themen 7
A Collections HashMap.containsKey findet keine immutablen Objekte Allgemeine Java-Themen 3
D Datentypen HashMap Allgemeine Java-Themen 5
R Collections Performance einer HashMap Allgemeine Java-Themen 26
C LinkedList und ArrayList in HashMap Allgemeine Java-Themen 4
T Erste Schritte HashMap<String, int> Allgemeine Java-Themen 2
K Hashmap sortieren Allgemeine Java-Themen 6
F HashMap überschreibt Daten von anderen HashMap Allgemeine Java-Themen 5
S HashMap containsKey liefert immer false zurück Allgemeine Java-Themen 15
H Problem beim Sortieren einer HashMap mit TreeSet Allgemeine Java-Themen 4
K HashMap sorting verhindern Allgemeine Java-Themen 10
J Generic von einer ArrayList/HashMap bekommen Allgemeine Java-Themen 7
L HashMap mit Enum Keys Allgemeine Java-Themen 3
J Array als Schlüssel für HashMap Allgemeine Java-Themen 6
S Geschwindigkeit HashMap oder .getParent Allgemeine Java-Themen 5
V Hashmap-Frage Allgemeine Java-Themen 3
M HashMap - Ich bin verwirrt Allgemeine Java-Themen 3
H2SO3- multiple Hashmap Allgemeine Java-Themen 5
K Threading - schreiben auf Hashmap/löschen - ConcurrentModificationException Allgemeine Java-Themen 3
J NullPointerException mit HashMap Allgemeine Java-Themen 2
V Probleme mit eigener Hashmap Allgemeine Java-Themen 10
N HashMap<String,Vector<String>> a = new HashMap<String,Vector<String>>(); Allgemeine Java-Themen 4
I HashMap Problem... Allgemeine Java-Themen 3
C HashMap Allgemeine Java-Themen 12
Daniel_L Map/HashMap - Reihenfolge von Einträgen Allgemeine Java-Themen 4
L HashMap Key Reihenfolge umkehren Allgemeine Java-Themen 8
N wie greife ich auf hashmap in vector zu Allgemeine Java-Themen 9
J Inhalt von HashMap vergleichen Allgemeine Java-Themen 3
Z Serialisierung und Deserialisierung einer HashMap Allgemeine Java-Themen 17
P Wieso HashMap-Zugriff mit Object, statt mit MyObject? Allgemeine Java-Themen 12
K Serialisierung von Hashmap in Vector Allgemeine Java-Themen 3
T Hashmap füllen mit rs sortierung Allgemeine Java-Themen 9
D HashMap sortieren Allgemeine Java-Themen 2
P Große Datenmenge wie speichern (HashMap? TreeMap?) Allgemeine Java-Themen 11
D HashMap Problem Allgemeine Java-Themen 14
G Runnables aus Hashmap starten Allgemeine Java-Themen 4
J java.util.ConcurrentModificationException bei HashMap? Allgemeine Java-Themen 2
G HashMap key ändern Allgemeine Java-Themen 5
L HashMap / Objekte auf Festplatte zur Laufzeit auf HD swappen Allgemeine Java-Themen 7
S Problem mit Hashmap Allgemeine Java-Themen 2
G Datei einlesen und in HashMap verarbeiten Allgemeine Java-Themen 3
E Auslesen aus Hashmap Allgemeine Java-Themen 3
P HashMap mit mehreren gleichen keys Allgemeine Java-Themen 4
alexpetri hashmap bästpractice Allgemeine Java-Themen 4
J HashMap mit Webservice realisierbar? Allgemeine Java-Themen 4
ARadauer hashmap vs hastable Allgemeine Java-Themen 5
T HashMap#values Reihenfolge Allgemeine Java-Themen 13
M ArrayList sortieren - HashMap mit sort_id vorhanden Allgemeine Java-Themen 2
L Wie kann ich eine HashMap abspeichern? Allgemeine Java-Themen 3
T HashMap (String, Object(String , int)) nach int sortieren Allgemeine Java-Themen 7
M HashMap kapselt zwei Objekte aber wie baut man eine Matrix? Allgemeine Java-Themen 2
E MySQL-Datenbank <-> HashMap/TreeMap Allgemeine Java-Themen 1
P List in Hashmap schreiben Allgemeine Java-Themen 5
M Threads in einer Hashmap Allgemeine Java-Themen 5
P HashMap an 2 Stellen veränderbar Allgemeine Java-Themen 13
P HashMap auflösen Allgemeine Java-Themen 9
MQue HashMap durchlaufen Allgemeine Java-Themen 2
MQue HashMap Allgemeine Java-Themen 2
M HashMap kommt beim Löschen aus dem Tritt Allgemeine Java-Themen 6
MQue HashMap Allgemeine Java-Themen 6
MQue HashMap Allgemeine Java-Themen 9
MQue Sichtbarkeit/HashMap/NullPointerexception Allgemeine Java-Themen 2
B HashMap.containsKey. Allgemeine Java-Themen 10
J byte-Array in Hashmap speichern? Allgemeine Java-Themen 3
S Klasse in HashMap speichern Allgemeine Java-Themen 3
G [quote]the type HashMap is not generic; it cannot be paramet Allgemeine Java-Themen 4
M HashMap sortiert Allgemeine Java-Themen 6
G Performance JDOM - DOM - eigene HashMap (SAX) Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben