Datentypen TreeMap nach Color sortiert (kd-Baum)

glörf

Mitglied
Ich benötige eine Datenstruktur/Datentyp mit dem/der sich folgendes realisieren lässt

gegeben ist als Input ein zweidimensionales Array das die Farben eines Bildes enthält und die x/y-Koordinanten als Index hat.

Java:
Color[][] bildArray


dieses soll konvertiert werden in eine Struktur, die jedem im Bild vorhanden Color-Wert (RGB) die Menge Punkte mit den Koordinaten x und y zweist, die genau diese Farbe besitzen. Die RGBs sollen dann natürlich noch einmal als Schlüssel vorkommen.

etwa so
(25,7,114) : {Point(7/5)}
(255,255,0) : {Point(2,99), Point(7,34)}


die Struktur soll wahlweise nach dem Wert von R, G oder B aus Color sortiert sein.

ich habe es mit
Java:
TreeMap<HashSet<Point>>
probiert, und für Color Comparable implementiert, aber da bekomme ich jedoch Probleme beim Einfügen der Punkte in die nach R,G oder B sortierte Struktur. Ich glaube das Problem liegt darin, dass TreeMap keine doppelten Schlüssel zulässt die auftreten wenn man nach R,G oder B “comparet”, aber in ihrer Gesamtheit eindeutig sind.


Anmerkung: das ganze sollen Knoten in einem kd-Baum werden, mit R,G und B als Schlüssel, x und y als Knotenwerte.


Bin für jede Hilfe dankbar:)
 
Zuletzt bearbeitet:

bERt0r

Top Contributor
Java:
class MyColor implements Compareable
{
private int R,G,B;
//get,set, Konstruktor, compareto
}
TreeMap<MyColor,Vector<Point>> ?
 
Zuletzt bearbeitet:
N

nillehammer

Gast
Also eine Datenstruktur, bei der man beliebig das Sortierkriterium zwischendrin ändern kann, kenne ich nicht. Ich würde darum empfehlen mit drei TreeMaps zu arbeiten, eine in der nach R, eine in der nach G und eine in der nach B sortiert ist.

Da Comparable<Color> natürlich nur ein Kriterium berücksichtigen kann, kommt es nicht in Frage. Implementiere also nicht Comparable. Sondern implementiere drei mal Comparator<Color> (eben einmal einen für R, einen für G und einen für B) und nutze jeweils eine Instanz dieser Implementierung bei dem Erstellen der drei TreeMaps.
 
Zuletzt bearbeitet von einem Moderator:

bERt0r

Top Contributor
Java:
import java.awt.Point;
import java.util.Random;
import java.util.TreeMap;
import java.util.Vector;


public class ColorMapTest {
	
	class MyColor implements Comparable<MyColor>
	{
		private int r,g,b;

		@Override
		public int compareTo(MyColor c) 
		{
			int red=c.getR();
			int blue=c.getB();
			int green=c.getG();
			
			if(r==red)
			{
				if(g==c.getG())
				{
					if(b==blue)
					{
						return 0;
					}
					else
					{
						if(b>blue)
						{
							return 1;
						}
						else
						{
							return -1;
						}
					}
				}
				else
				{
					if(g>green)
					{
						return 1;
					}
					else
					{
						return -1;
					}
				}
			}
			else
			{
				if(r>red)
				{
					return 1;
				}
				else
				{
					return -1;
				}
			}
		
		}

		public MyColor(int r, int g, int b) {
			super();
			this.r = r;
			this.g = g;
			this.b = b;
		}

		public int getR() {
			return r;
		}

		public void setR(int r) {
			this.r = r;
		}

		public int getG() {
			return g;
		}

		public void setG(int g) {
			this.g = g;
		}

		public int getB() {
			return b;
		}

		public void setB(int b) {
			this.b = b;
		}
		
		public String toString()
		{
			return "\nMyColor["+r+","+g+","+b+"]";
		}
		
	}

	ColorMapTest()
	{
		TreeMap<MyColor,Vector<Point>> map=new TreeMap<MyColor,Vector<Point>>();
		Random r=new Random();
		for (int i=0;i<100;i++)
		{
			int red=r.nextInt(5);
			int green=r.nextInt(5);
			int blue=r.nextInt(5);
			MyColor col=new MyColor(red,green,blue);
			Vector<Point> points;
			if(map.containsKey(col))
			{
				points=map.get(col);
			}
			else
			{
				points=new Vector<Point>();
			}
			int x=r.nextInt(100);
			int y=r.nextInt(100);
			points.add(new Point(x,y));
			map.put(col, points);
		}
		System.out.println(map);
		
	}
	public static void main(String [] args)
	{
		new ColorMapTest();
	}
}
 

glörf

Mitglied
Java:
import java.awt.Point;
import java.util.Random;
import java.util.TreeMap;
import java.util.Vector;


public class ColorMapTest {
	
	class MyColor implements Comparable<MyColor>
	{
		private int r,g,b;

		@Override
		public int compareTo(MyColor c) 
		{
			int red=c.getR();
			int blue=c.getB();
			int green=c.getG();
			
			if(r==red)
			{
				if(g==c.getG())
				{
					if(b==blue)
					{
						return 0;
					}
					else
					{
						if(b>blue)
						{
							return 1;
						}
						else
						{
							return -1;
						}
					}
				}
				else
				{
					if(g>green)
					{
						return 1;
					}
					else
					{
						return -1;
					}
				}
			}
			else
			{
				if(r>red)
				{
					return 1;
				}
				else
				{
					return -1;
				}
			}
		
		}

		public MyColor(int r, int g, int b) {
			super();
			this.r = r;
			this.g = g;
			this.b = b;
		}

		public int getR() {
			return r;
		}

		public void setR(int r) {
			this.r = r;
		}

		public int getG() {
			return g;
		}

		public void setG(int g) {
			this.g = g;
		}

		public int getB() {
			return b;
		}

		public void setB(int b) {
			this.b = b;
		}
		
		public String toString()
		{
			return "\nMyColor["+r+","+g+","+b+"]";
		}
		
	}

	ColorMapTest()
	{
		TreeMap<MyColor,Vector<Point>> map=new TreeMap<MyColor,Vector<Point>>();
		Random r=new Random();
		for (int i=0;i<100;i++)
		{
			int red=r.nextInt(5);
			int green=r.nextInt(5);
			int blue=r.nextInt(5);
			MyColor col=new MyColor(red,green,blue);
			Vector<Point> points;
			if(map.containsKey(col))
			{
				points=map.get(col);
			}
			else
			{
				points=new Vector<Point>();
			}
			int x=r.nextInt(100);
			int y=r.nextInt(100);
			points.add(new Point(x,y));
			map.put(col, points);
		}
		System.out.println(map);
		
	}
	public static void main(String [] args)
	{
		new ColorMapTest();
	}
}

danke, ich brauche aber 3 Listen, die jew. nach R, B, G sortiert sind und kosistent zueinander sind. und wenn man eine der drei nach Rot sortieren würde, dann können Schlüssel mehrfach vorkommen:

nach RGB sortiert (wie in deinem Code) sind sie Schlüssel eindeutig, weil ja alle 3 zum Schlüssel gehören;
Eintrag1: (255,100,7) ,Vector<Point>
Eintrag2: (255,230,2) ,Vector<Point>

dann z.b. nur nach R:
- die zwei Einträge haben den gleichen Schlüssel (255), aber TreeMap will lässt keine doppelten Schlüssel zu und überschreibt dann einen Eintrag mit dem anderen.

Verstehst du mein Problem?:( (oder ich hab etwas nicht richtig verstanden)
 
Zuletzt bearbeitet:

bERt0r

Top Contributor
Edit:
1 Treemap<MyColor,Vector<Point>>
3 Vector<MyColor>
3 Comparatoren
Java:
import java.awt.Point;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Random;
import java.util.TreeMap;
import java.util.Vector;


public class ColorMapTest {
	
	class MyColor implements Comparable<MyColor>
	{
		private int r,g,b;

		public MyColor(int r, int g, int b) {
			super();
			this.r = r;
			this.g = g;
			this.b = b;
		}

		public int getR() {
			return r;
		}

		public void setR(int r) {
			this.r = r;
		}

		public int getG() {
			return g;
		}

		public void setG(int g) {
			this.g = g;
		}

		public int getB() {
			return b;
		}

		public void setB(int b) {
			this.b = b;
		}

		public String toString()
		{
			return "MyColor["+r+","+g+","+b+"]";
		}

		@Override
		public int compareTo(MyColor c) 
		{
			int red=c.getR();
			int blue=c.getB();
			int green=c.getG();

			if(r==red)
			{
				if(g==c.getG())
				{
					if(b==blue)
					{
						return 0;
					}
					else
					{
						if(b>blue)
						{
							return 1;
						}
						else
						{
							return -1;
						}
					}
				}
				else
				{
					if(g>green)
					{
						return 1;
					}
					else
					{
						return -1;
					}
				}
			}
			else
			{
				if(r>red)
				{
					return 1;
				}
				else
				{
					return -1;
				}
			}

		}

	}

	
	ColorMapTest()
	{
		TreeMap<MyColor,Vector<Point>> pointMap=new TreeMap<MyColor,Vector<Point>>();
		Vector<MyColor> rVect=new Vector<MyColor>();
		Vector<MyColor> gVect=new Vector<MyColor>();
		Vector<MyColor> bVect=new Vector<MyColor>();
				
		
		Random r=new Random();
		for (int i=0;i<100;i++)
		{
			int red=r.nextInt(5);
			int green=r.nextInt(5);
			int blue=r.nextInt(5);
			MyColor col=new MyColor(red,green,blue);
			Vector<Point> points;
			if(pointMap.containsKey(col))
			{
				points=pointMap.get(col);
			}
			else
			{
				points=new Vector<Point>();
			}
			int x=r.nextInt(100);
			int y=r.nextInt(100);
			points.add(new Point(x,y));
			pointMap.put(col, points);
		}
		
		Comparator<MyColor> rCompare=new Comparator<MyColor>()
		{
			@Override
			public int compare(MyColor c1, MyColor c2) {			
				if (c1.getR()==c2.getR())
				{
					return 0;
				}
				else
				{
					if(c1.getR()<c2.getR())
					{
						return Integer.MIN_VALUE;
					}
					else
					{
						return Integer.MAX_VALUE;
					}
				}
			}

		};

		Comparator<MyColor> gCompare=new Comparator<MyColor>()
		{
			@Override
			public int compare(MyColor c1, MyColor c2) {			
				if (c1.getR()==c2.getR())
				{
					return 0;
				}
				else
				{
					if(c1.getR()<c2.getR())
					{
						return Integer.MIN_VALUE;
					}
					else
					{
						return Integer.MAX_VALUE;
					}
				}
			}
		};



		Comparator<MyColor> bCompare=new Comparator<MyColor>()
		{
			@Override
			public int compare(MyColor c1, MyColor c2) {			
				if (c1.getR()==c2.getR())
				{
					return 0;
				}
				else
				{
					if(c1.getR()<c2.getR())
					{
						return Integer.MIN_VALUE;
					}
					else
					{
						return Integer.MAX_VALUE;
					}
				}
			}
		};
		
		
		rVect.addAll(pointMap.keySet());
		Collections.sort(rVect, rCompare);
		gVect.addAll(pointMap.keySet());
		Collections.sort(gVect, gCompare);
		bVect.addAll(pointMap.keySet());
		Collections.sort(bVect, bCompare);
		
		System.out.println("Sortiert nach rot");
		for(MyColor c:rVect)
		{
			System.out.println(c+": "+pointMap.get(c));
		}
		System.out.println("\n\nSortiert nach grün");
		for(MyColor c:gVect)
		{
			System.out.println(c+": "+pointMap.get(c));
		}
		System.out.println("\n\nSortiert nach blau");
		for(MyColor c:bVect)
		{
			System.out.println(c+": "+pointMap.get(c));
		}
		
	}
	public static void main(String [] args)
	{
		new ColorMapTest();
	}
}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Neumi5694 Datentypen ArrayList vs TreeMap Allgemeine Java-Themen 6
G treeMap.putall funktioniert nicht?! Allgemeine Java-Themen 2
B Collections TreeSet/TreeMap, doppelte Einträge zulassen ? Allgemeine Java-Themen 11
G mittleres Element aus TreeMap Allgemeine Java-Themen 5
J Vorsortieren für TreeMap Allgemeine Java-Themen 7
W Comparator oder TreeMap? Allgemeine Java-Themen 10
C Reihenfolge einer SortedMap/TreeMap umkehren Allgemeine Java-Themen 3
D Probleme beim schreiben / lesen in TreeMap Allgemeine Java-Themen 9
B TreeMap Index !!! Allgemeine Java-Themen 6
J Eindeutige ID für Objekte als Keys in TreeMap Allgemeine Java-Themen 12
P Große Datenmenge wie speichern (HashMap? TreeMap?) Allgemeine Java-Themen 11
T TreeMap durch Comparator mit Generics sortieren Allgemeine Java-Themen 9
E MySQL-Datenbank <-> HashMap/TreeMap Allgemeine Java-Themen 1
T [TreeMap] Corresponding value to a key Allgemeine Java-Themen 10
Ernesto95 HTTP Mit JavaScript erzeugte dynamische Webseite auslesen und nach einem Schlüsselwort durchsuchen Allgemeine Java-Themen 6
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
I 2D-Grafik Vektor-Grafik über die Zwischenablage nach Adobe Illustrator transferieren Allgemeine Java-Themen 8
M Suche nach String mit unbekannten characters Allgemeine Java-Themen 53
L 2 Dimensionale ListArray Abfrage nach einem Wert suchen Allgemeine Java-Themen 5
torresbig Url nach Webseiten-Login auslesen & Daten an Webseite senden Allgemeine Java-Themen 9
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
OnDemand Ram Freigabe erfolgt nicht nach Prozessende Allgemeine Java-Themen 18
G Geotools Probleme nach PC-Wechsel Allgemeine Java-Themen 6
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
I In Java geschriebene Software nach Mac OS portieren Allgemeine Java-Themen 7
M TicTacToe Sound nach jedem Zug Allgemeine Java-Themen 21
I HTML / XHTML Seite nach Excel exportieren. Suche Lib Allgemeine Java-Themen 12
J4n5chmiddi Methoden Website-URL im Browser öffnen nach erfolgreicher Basisauthentifizierung in Java Allgemeine Java-Themen 12
pkm Frage nach eventuellem syntaktischen Zucker bei der Konkatenation von ArrayLists Allgemeine Java-Themen 4
Monokuma String List nach Zahlen und Worten sortieren Allgemeine Java-Themen 9
H Collections Aktuellen Index generell und nach Sortierung ausgeben Allgemeine Java-Themen 6
Kirby.exe Filename nach bestimmtem Pattern durchsuchen Allgemeine Java-Themen 5
S Wörterliste nach Wörtern mit u durchsuchen und diese auf der Konsole ausgeben lassen Allgemeine Java-Themen 33
W Pdf verwerfen, weil Checkbox nach Unterschrift geaendert wurde Allgemeine Java-Themen 5
G File not found - nach dem Kompilieren Allgemeine Java-Themen 6
S Swing Speichern nach Button-Klick Allgemeine Java-Themen 5
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
M Java 8 nach Java 6 konvertieren Allgemeine Java-Themen 7
N Neustarten des Codes nach der Fehlermeldung Allgemeine Java-Themen 17
L Nach dem Login // Java Desktop Software Allgemeine Java-Themen 7
N Programm nach Abschluss neustarten lassen Allgemeine Java-Themen 6
F Java Code ausführen direkt nach Anmelden in Windows Allgemeine Java-Themen 2
J Jasper Reports - Compilerproblem nach Umstellung von Groovy auf Java Allgemeine Java-Themen 7
looparda Liste filtern nach Prädikaten verschiedener Typen Allgemeine Java-Themen 3
S Apache POI Filtern nach bestimmten Kriterium Allgemeine Java-Themen 1
L Korrektur nach der Berechnung vornehmen, aber wie? Allgemeine Java-Themen 11
C Config nach bestimmten Wertdurchsuchen. Allgemeine Java-Themen 2
B Suche nach einem Testprogramm für meine BA Allgemeine Java-Themen 0
B Maven Keycloak library wirft exceptions nach maven package Allgemeine Java-Themen 1
D BufferedReader bricht nach 1248 Iterationen ab Allgemeine Java-Themen 14
G Eclipse Java findet MySQL Driver nach export nicht mehr Allgemeine Java-Themen 2
H IDEA IntelliJ Java Mail funktioniert nach Export nicht mehr! Allgemeine Java-Themen 1
F Zurnung nach Buchstaben und deren Prüfung Allgemeine Java-Themen 9
M Dateien nach kopieren vergleichen Allgemeine Java-Themen 9
MiMa Sortieren nach Stellenangaben Allgemeine Java-Themen 7
L Erste Schritte Liste von Datums filter nach Monate Allgemeine Java-Themen 4
GreenTeaYT Elemente eines 2Dim LinkedList von links nach rechts ausgeben? Allgemeine Java-Themen 0
J Ausgabe von Links nach Rechts ausgeben? Allgemeine Java-Themen 2
K JAR Datei Corrupt nach Kopieren Allgemeine Java-Themen 4
The Pi 2D-Grafik Tic Tac Toe nach Gewinn rot Allgemeine Java-Themen 1
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
C PDFBox: Nach RegEx ganze Zeile Allgemeine Java-Themen 4
R javax.comm --> Programm funktioniert nach Export nicht mehr Allgemeine Java-Themen 0
L Suche nach CalDav Server API Allgemeine Java-Themen 0
K Java ruft Methoden nicht der Reihe nach auf Allgemeine Java-Themen 14
T Textarea nach nur 1 wort durchsuchen Allgemeine Java-Themen 3
D Methoden Buttons erscheinen doppelt nach Wiederholung in Schleife Allgemeine Java-Themen 1
I nach Image Load in ListView, kann Ordner nicht mehr gelöscht werden Allgemeine Java-Themen 1
K Auf einer Website nach einem String suchen Allgemeine Java-Themen 5
C Eclipse OutOfMemory nach dem exportieren Allgemeine Java-Themen 4
D Erste Schritte Array von einer forschleife nach ausserhalb trasferieren Allgemeine Java-Themen 3
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
heyluigi Random Integer Array Ausgabe nach Größe sortieren Allgemeine Java-Themen 6
D Java Datei nach Eclipse Export funktioniert nicht Allgemeine Java-Themen 0
B Bild aus Jar kann nach Export nicht mehr gefunden werden Allgemeine Java-Themen 13
B Umgebungsvariable Anpassen der Umgebungsvariablen nach Java-Update ? Allgemeine Java-Themen 14
H jid3lib nach schreiben keine Tags im Folder angezeigt Allgemeine Java-Themen 1
F Methoden Arraylist weiterverwenden nach methoden Aufruf Allgemeine Java-Themen 2
KilledByCheese Dezimal nach Hexadezimal rechner wirft seltsame exception Allgemeine Java-Themen 4
J Programm meldet "Keine Rückmeldung" nach Verbindung zum Server Allgemeine Java-Themen 4
E Java wird beendet nach paar Sekunden Allgemeine Java-Themen 14
H Best Practice setHeader in jsp nach RequestDispatcher.include Allgemeine Java-Themen 0
L Nach Button drücken den Text festspeichern Allgemeine Java-Themen 9
M .jar nach Datei prüfen Allgemeine Java-Themen 2
F String nach Schlüsselwörtern durchsuchen und ganze Zeile ausgeben Allgemeine Java-Themen 4
HarleyDavidson Input/Output Heruntergeladene Datei direkt nach dem Download öffnen ohne zu speichern Allgemeine Java-Themen 1
J Swing Cursor.WAIT funktioniert nicht nach JFileChooser Allgemeine Java-Themen 1
VfL_Freak JDK installieren Problem mit Erstellungspfad nach Wechsel von Java7 auf Java8 Allgemeine Java-Themen 1
B Eclipse Nach Export einer .jar Fehler: Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 5
thet1983 nach teilen eines Dateinamens suchen Allgemeine Java-Themen 6
F JLabel nach 5 Sekunden wieder leeren Allgemeine Java-Themen 7
M Fasta nach Mustern durchsuchen dauert zu lange Allgemeine Java-Themen 2
J Bilder halb in falscher Farbe nach kopieren aus Web Allgemeine Java-Themen 3
Thallius Neuen Prozess starten, der auch nach Beedingung des Starter-Prozesses weiterläuft? Allgemeine Java-Themen 5
T Nach Java Update: Jar Datein öffnen sich nicht mehr mit doppelklick Allgemeine Java-Themen 3
S Start des zweiten Threads erst nach Beenden des ersten Threads Allgemeine Java-Themen 13
A Funktionen aufrufen nach Schema x Allgemeine Java-Themen 2
G JavaFX Problem nach Update auf Java 8 Allgemeine Java-Themen 0
AssELAss String jeweils nach x Zeichen Zeilenumbruch Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben