Koordinatentupel-Map sortieren??

Status
Nicht offen für weitere Antworten.

SuperFamicom

Aktives Mitglied
Hallo,
ich habe eine Hashmap<String, Objekt>, die Korrdinatentupel und das dazugehörige Objekt enthält.
String enthält die Koordinaten, als Bsp.: "10:30".
10 entspräche dem x- und 30 dem y-Wert.
Nun will ich den String splitten und sortieren: (1, 1), (1, 2), ..., (1, n), (2, 1), (2, 2), ..., (m, n)
Wie geht's schnell?

-VG-
 
S

SlaterB

Gast
was hat denn das Splitten eines Strings mit einer Koordinatentupel-Map zu tun? ;)

mit
String[] parts = st.split("\\),");
bekommst du aus
(1, 1),_(1, 2),_(n, m)
die Einzelstrings
(1, 1
_(1, 2
_ (n, m)

nicht besonders schön, vielleicht das Leerzeichen und die öffende Klammer auch ins split aufnehmen,
dann müsstest du nur noch das erste und letzte Element etwas korrigieren

Alternativen:
indexOf + substring

RegEx und find()
 

0x7F800000

Top Contributor
egal woher die koordinaten kommen: wenn du diese öfter als einmal im leben brauchst, würde ich dringend empfehlen, diese in angemessener form, nämlich als tupel von zahlen, abzuspeichern. Wenn du jedes mal Strings splittest und Ziffer parsen musst, ist das performancemäßig (verglichen zum auslesen von gewöhnlichen integern o.ä.) eine totale katastrophe.
 

SuperFamicom

Aktives Mitglied
@SlaterB:
*g* villeicht etwas unglücklich rübergebracht ;)
Die Map hat einen Key vom Typ String und einen Eintrag mit dem Objekt (hier irrelevant).
Die keys sehen so aus: "10:30".
Mit den Klammern wollte ich nur für Übersicht sorgen.
Das mit dem splkit-Befehl habe ich jetzt auch.
ich hab erstmal eine Klasse Point eingeführt:

Code:
class Point implements Comparable<Point> {
    int x;
    int y;
    
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    
    public int compareTo(Point o) {
        if (this.x == o.x) {
            return this.y - o.y;
        } else {
            return this.x - o.x;
        }
    }
    
}

Sortiert wird hier:

Code:
ArrayList<Point>    list = new ArrayList<Point>();
        
        for (String keys : source.keySet()) {
            list.add(new Point(Integer.parseInt(keys.split(":")[0]), Integer.parseInt(keys.split(":")[1])));
        }
        Collections.sort(list);
        Iterator it = list.iterator();
        
        while (it.hasNext()) {
            System.out.println(((Point) it.next()).x + ", " + ((Point) it.next()).y);
        }

Ein Problem habe ich jetzt immernoch dabei: Er spuckt mir eine Liste aus, deren size() kleiner ist, als die eingespeiste source-HashMap-size().
Ein Bsp.: source enthält z.b. die Koordinaten "7:19", "2:19", "2:16", "5:1" (~> Größe = 4)
Dann schrumpft der mir das ganze und gibt aus: "2:16", "5:1" und "7:19" (~> Größe = 3)
"2:19" verschwindet im Nichts.
 

0x7F800000

Top Contributor
verstehe ich nicht. Sollte nicht so sein. Kannst du ein kompilierbares Stück code posten, bei dem das problem auftaucht?
 
S

SlaterB

Gast
da wird doch zweimal it.next() aufgerufen ;)
jeder next()-Aufruf -> nächstes Element


> "2:19", "2:16",
> Dann schrumpft der mir das ganze und gibt aus: "2:16",
> "2:19" verschwindet im Nichts.

aus "4000:19", "2:16",
würde "4000:16" werden
 

0x7F800000

Top Contributor
da hat SlaterB wieder mal genauer hingeguggt... Naja, großer schwachsinn ist das schon (wofür gibt's denn toString()?) aber mit dem beschriebenen Fehler hat's nichts zu tun. Also ich meine: auch wenn da jetzt unsinn ausgegeben wird, an der size() der map kann das ja nichts ändern.
 

0x7F800000

Top Contributor
Man trinke eine Tasse Tee, schieße sich mit der Schrotflinte ins Bein, und schließe daraus, dass das Teetrinken wehtut^^ :rolleyes:
 

SuperFamicom

Aktives Mitglied
Jetzt tut sich das nächste problem auf -.-

Code:
private final HashMap<Point, EditorTile> sortKeys(HashMap<Point, EditorTile> source) {
        System.out.println("source-size() = " + source.size());
        
        ArrayList<Point>    list = new ArrayList<Point>();
        
        for (Point keys : source.keySet()) {
            list.add(new Point(keys.x, keys.y));
        }
        Collections.sort(list);
        for (int i = 0; i < list.size(); i++) {
            System.out.println("x = " + list.get(i).x + ", y = " + list.get(i).y);
        }
        
        return null;
    }
... funktioniert soweit schön und gut. (Ignoriert den Rückgabewert. Soweit bin ich noch nicht.)

Ich hab jetzt Andreys Ratschlag befolgt und kein String mehr als Schlüssel, den ich splitte.
Der neue Schlüssel ist vom Typ Point.
In meinem Programm kann es vorkommen, dass das Objekt mit dem dazugehörigen Schlüssel neu zugewiesen wird: ein neues Objekt mit selbigen Schlüssel. Normalerweise sollte dieser beim put-Aufruf den alten Eintrag überschreiben. Die folgende Methode fügt ein Objekt X mit Schlüssel A hinzu oder (sollte zumindest - laut Literatur -) überschreibt gegebenfalls ein vorhandenes Objekt X mit Schlüssel A mit einem neuen Objekt Y und Schlüssel A.

Was mein Programm hier an der Stelle macht: zweimal der gleiche Schlüssel Point (mit x und y) mit put-Aufruf führen zu doppelten Einträgen:

Code:
private final void addTile(int x, int y) {
        map.put(new Point(x, y), new EditorTile(parent.getSelectedTile().getImage(), x, y));
    }

Dies soll natürlich nicht sein. Muss ich dem Point-Schlüssel eine eindeutige ID mitgeben? Reichen x und y als Koordinaten nicht aus? Oder liegt es am new-Operator? Muss ich jetzt noch eine Liste erstellen mit den Schlüsseln?

Ich hoffe, das Problem ist verständlich formuliert^^

-VG-
 

mvitz

Top Contributor
Du solltest in Point noch die Methode equals überschreiben:
[HIGHLIGHT="Java"]public boolean equals(Object anObject) {
}[/HIGHLIGHT]

Zu tun ist hier:
Prüfen ob anObject != null gucken ob anObject vom Typ point ist und darauf casten. Anschließend x und y koordinaten vergleichen.
 

mvitz

Top Contributor
Achso und soweit ich weiß, soll man wenn man equals überschreibt auch hashCode überschreiben. Evtl ginge als Hashcode für so ein Tupel etwas in der Form:
[HIGHLIGHT="Java"]@Override
public int hashCode() {
return this.x * 10 + this.y;
}[/HIGHLIGHT]
 
S

Spacerat

Gast
Equals scheint hier wohl weniger relevant... Er arbeitet mit einer HashMap. Deswegen wohl eher "hashCode()". Denn selbst wenn die Points inhaltlich gleich sind, sind es doch zwei verschiedene Instanzen
@Edit: habi55 war schneller...
@Edit2: Wenn man equals überschreibt, soll man auch hashCode überschreiben... Mal aufräumen mit diesem saudämlichen Gerücht....
equals bedeutet inhaltliche Gleichheit. hashCode ist dagegen (suzusagen) eine Instanzierungs-ID. hashCode sollte also nur zusätzlich überschrieben werden, wenn man es vermeiden will, das eine HashMap zwei Objekte aufnimmt, die zwar inhaltlich gleich sind, jedoch zwei verschiedene Instanzen.
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Fynn29 Liste sortieren ohne Array und ohne vorgegebene Sortierung Allgemeine Java-Themen 24
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
L allgemein Strings händisch in Liste sortieren Allgemeine Java-Themen 47
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
Willi.We Array sortieren Allgemeine Java-Themen 5
L ArrayList sortieren Allgemeine Java-Themen 2
Monokuma String List nach Zahlen und Worten sortieren Allgemeine Java-Themen 9
MiMa ArrayList sortieren?? Allgemeine Java-Themen 5
C MySQL Tabellen sortieren. Allgemeine Java-Themen 33
Curtis_MC Collections Liste anhand mehrere Kriterien sortieren Allgemeine Java-Themen 6
B Java Mail: Emails sortieren? Allgemeine Java-Themen 5
G Liste (UsageStats) sortieren (Android) Allgemeine Java-Themen 5
FRI3ND Datentypen Date-Array sortieren - Text mitnehmen? Allgemeine Java-Themen 7
P Wertepaare sortieren Allgemeine Java-Themen 3
MiMa Sortieren nach Stellenangaben Allgemeine Java-Themen 7
T Collections ArrayList Sortieren Allgemeine Java-Themen 4
P Listen sortieren Allgemeine Java-Themen 1
U Methoden Algorithmus MergeSort String [ ] array sortieren programmieren Allgemeine Java-Themen 17
S Verkettete (Teil)Liste sortieren ( rekursiv bis n) Allgemeine Java-Themen 2
K Strings sortieren: 2 Kritieren Allgemeine Java-Themen 5
B Algortihmus zum linearen Sortieren Allgemeine Java-Themen 1
K ArrayList sortieren Allgemeine Java-Themen 16
heyluigi Random Integer Array Ausgabe nach Größe sortieren Allgemeine Java-Themen 6
H Liste sortieren anhand optionalem Property Allgemeine Java-Themen 3
2 Mehrere Uhrzeiten Sortieren Allgemeine Java-Themen 2
B Counting Sort (Sortieren durch Zählen) Allgemeine Java-Themen 13
H Liste von Objekten generisch sortieren Allgemeine Java-Themen 0
Bluedaishi String Array mit Datum und Uhrzeit String sortieren Allgemeine Java-Themen 6
K Sortieren nach Vorgabe Allgemeine Java-Themen 6
S Erste Schritte Arrayliste alphabetisch sortieren mit Eingabe Allgemeine Java-Themen 9
L Sortieren von "Map<String, Object>" Allgemeine Java-Themen 2
M Sortieren und Leerzeichen Allgemeine Java-Themen 11
W Array Indizes sortieren Allgemeine Java-Themen 16
D Sortieren von Liste zu unperformant Allgemeine Java-Themen 6
E Array alphabetisch sortieren Allgemeine Java-Themen 1
5 Objekte Sortieren lassen Allgemeine Java-Themen 7
P Beim sortieren nullpointerexception Allgemeine Java-Themen 12
G Map nach key sortieren Allgemeine Java-Themen 14
T Array Sortieren (null Werte ans Ende) Allgemeine Java-Themen 2
Gossi Collections (Unbekannte) Liste Sortieren Allgemeine Java-Themen 10
S Int Values sortieren Allgemeine Java-Themen 7
S Sortieren nach Objekten Allgemeine Java-Themen 13
A 2D-array problem (sortieren) Allgemeine Java-Themen 6
T Liste mit GregorianCalendar-Objekten in List einlesen, mit Collection sortieren und ausgeben Allgemeine Java-Themen 3
D priority queue sortieren Allgemeine Java-Themen 10
G List<Person> sortieren Allgemeine Java-Themen 6
K Hashmap sortieren Allgemeine Java-Themen 6
H Problem beim Sortieren einer HashMap mit TreeSet Allgemeine Java-Themen 4
M ArrayList<String>, String häufigkeit sortieren Allgemeine Java-Themen 4
J Wie sortieren? Allgemeine Java-Themen 11
T Liste sortieren Allgemeine Java-Themen 6
K Strings sortieren (knifflig) Allgemeine Java-Themen 7
B JTable nach Icon sortieren Allgemeine Java-Themen 6
C ArrayList (mit Objekten) sortieren Allgemeine Java-Themen 12
J Map nach value sortieren Allgemeine Java-Themen 14
N Zahlen in Strings einer ArrayList sortieren Allgemeine Java-Themen 14
V ArrayList sortieren Allgemeine Java-Themen 7
S String-Array nach Datum sortieren Allgemeine Java-Themen 10
Developer_X Ein Array nach einem bestimmten Attribut sortieren Allgemeine Java-Themen 3
B Sortieren mit generischen Datentypen Allgemeine Java-Themen 3
C ArrayList anhand von zwei Attributen sortieren Allgemeine Java-Themen 4
O Sortieren von Telefonnummern Allgemeine Java-Themen 8
D JTabel sortieren nach mehreren kriterien Allgemeine Java-Themen 3
G Verschachtelte Treemaps, nach Value sortieren Allgemeine Java-Themen 11
K ArrayList nach bestimmtem Muster sortieren Allgemeine Java-Themen 3
I Vector mit Objekten sortieren,Videos mit JMF wiedergeben Allgemeine Java-Themen 6
C ArrayList sortieren (mehrere Kriterien) Allgemeine Java-Themen 6
G ArrayList mit quicksort sortieren Allgemeine Java-Themen 9
Spot84 Vector nach Ressourcetyp sortieren Allgemeine Java-Themen 4
G sortieren von generics Allgemeine Java-Themen 10
Z Als Final deklarierte Klasse im Array sortieren Allgemeine Java-Themen 2
C ArrayList nach Datum sortieren Allgemeine Java-Themen 7
O ArrayList sortieren Allgemeine Java-Themen 8
G ArrayList mit Indices parallel sortieren Allgemeine Java-Themen 8
D HashMap sortieren Allgemeine Java-Themen 2
C Sortieren File[] Allgemeine Java-Themen 5
W [solved] Vector sortieren (Collection / Comparable?) Allgemeine Java-Themen 7
D LinkedList anhand einer long-Variable der Objekte sortieren Allgemeine Java-Themen 5
O Vektoren in Vektor sortieren aber mit Java 1.4 (!) Allgemeine Java-Themen 4
T TreeMap durch Comparator mit Generics sortieren Allgemeine Java-Themen 9
M ArrayList sortieren - HashMap mit sort_id vorhanden Allgemeine Java-Themen 2
A Sortieren mit Java Allgemeine Java-Themen 3
J Properties sortieren Allgemeine Java-Themen 6
T HashMap (String, Object(String , int)) nach int sortieren Allgemeine Java-Themen 7
E Bitte um Rat: Sortieren mit ArrayList Allgemeine Java-Themen 2
G Strings die Zahlen enthalten sinnvoll sortieren (A2 < A10 Allgemeine Java-Themen 4
G List mit selbstdefinierten Objekten sortieren Allgemeine Java-Themen 2
F Doppelt verkettete Liste sortieren? Allgemeine Java-Themen 8
S ArrayList nach mehreren Spalten sortieren? Allgemeine Java-Themen 13
G Set absteigend Sortieren Allgemeine Java-Themen 6
B ein spezielles Byte-Array sortieren Allgemeine Java-Themen 11
D Sortieren? Allgemeine Java-Themen 13
N ArrayList sortieren Allgemeine Java-Themen 10
L Nach Häufigkeit sortieren Allgemeine Java-Themen 6
S Dten im Excel sortieren Allgemeine Java-Themen 5
Z Elemente in Vector nach Häufigkeit sortieren. Allgemeine Java-Themen 13
H Objekte Sortieren Allgemeine Java-Themen 4
F Kann man String[] sortieren? Allgemeine Java-Themen 2
H will einfach nicht sortieren! Allgemeine Java-Themen 23
T Collections/Arrays sortieren => ä, ö, ü, ß Groß/klein Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben