Elemente innerhalb einer ArrayList vergleichen

Eichelhäer

Bekanntes Mitglied
Hallo,

Ich hab ne ArrayList mit Rechtecken (jedes hat ne eigene ID) und möchte diese auf Überschneidungen prüfen. Das Problem ist, dass sich erstens die Rechtecke auch selber prüfen und ich zweitens nicht weiß wie man mittels ID die Rechtecke in einer for-Schleife unterscheidet.

Weiß jemand Rat?

Gruß Eichelhäer
 

Javinner

Top Contributor
Braucht ein Rechteck hier wirklich eine ID?
Java:
public class RectIntersets
{

    public static void main(String[] args)
    {
        Rectangle[] array = {new Rectangle(0, 0, 10, 10), new Rectangle(0, 0, 15, 15)};
        Rectangle a = new Rectangle(11, 11, 13, 13);
        for(int i = 0; i < array.length; i++)
        {
            if(a.intersects(array[i]))
            {
                System.out.println(array[i].toString() + ", on Place: " + i);
            }
        }
    }
   
}
/** Output */
java.awt.Rectangle[x=0,y=0,width=15,height=15], on Place: 1
 

Eichelhäer

Bekanntes Mitglied
Damn, hab mich zu früh gefreut.

Java:
@Override
    public int hashCode() {
        return id;
    }

    @Override
    public boolean equals(Object o) {
        Sprite s = (Sprite) o;
        if(o instanceof Sprite) {
            if(s.id != this.id) {
                return true;
            }
        }
        return false;
    }

Und anschließender Prüfung in der for schleife liefert kein true.

Versteh aber nicht warum.

Hier noch kurz der Aufruf:

Java:
for(int p = 0;p<peasants.size();p++) {
            peasants.get(p).update();
            if(peasants.get(p).equals(peasants.get(p))) {
                if(Tools.collision(peasants.get(p),peasants.get(p))) {
                    peasants.get(p).x = peasants.get(p).getLastX();
                    peasants.get(p).y = peasants.get(p).getLastY();
                   
                }
            }
           
        }
 

Eichelhäer

Bekanntes Mitglied
Hallo nochmal,

ich möchte es so und so funktioniert es, allerdings für 100 Sprites ist das verdammt viel arbeit:

Java:
if(Tools.collision(peasants.get(0),peasants.get(1))) {
                peasants.get(0).x = peasants.get(0).getLastX();
                peasants.get(0).y = peasants.get(0).getLastY();   
            }
            if(Tools.collision(peasants.get(0),peasants.get(2))) {
                peasants.get(0).x = peasants.get(0).getLastX();
                peasants.get(0).y = peasants.get(0).getLastY();   
            }
            if(Tools.collision(peasants.get(1),peasants.get(2))) {
                peasants.get(1).x = peasants.get(1).getLastX();
                peasants.get(1).y = peasants.get(1).getLastY();   
            }
            if(Tools.collision(peasants.get(1),peasants.get(0))) {
                peasants.get(1).x = peasants.get(1).getLastX();
                peasants.get(1).y = peasants.get(1).getLastY();   
            }
            if(Tools.collision(peasants.get(2),peasants.get(1))) {
                peasants.get(2).x = peasants.get(2).getLastX();
                peasants.get(2).y = peasants.get(2).getLastY();   
            }
            if(Tools.collision(peasants.get(2),peasants.get(0))) {
                peasants.get(2).x = peasants.get(2).getLastX();
                peasants.get(2).y = peasants.get(2).getLastY();   
            }
 

mrBrown

Super-Moderator
Mitarbeiter
@Eichelhäer
Schau dir Java-Docs zum Thema "Rectangle" mal an, für dich ist die Methode "
public boolean intersects(Rectangle r)" interessant..
Ich würde von Rechteck nicht auf Rectangle schließen, das ist oftmals ne ungeeignete Klasse ;)

Bei der ID Stimm ich dir aber zu, die ist für sowas wie Rechtecke Unsinn (außer für die awt-Rectangle-Klasse :p )

Hallo nochmal,

ich möchte es so und so funktioniert es, allerdings für 100 Sprites ist das verdammt viel arbeit:

Java:
if(Tools.collision(peasants.get(0),peasants.get(1))) {
                peasants.get(0).x = peasants.get(0).getLastX();
                peasants.get(0).y = peasants.get(0).getLastY(); 
            }
            if(Tools.collision(peasants.get(0),peasants.get(2))) {
                peasants.get(0).x = peasants.get(0).getLastX();
                peasants.get(0).y = peasants.get(0).getLastY(); 
            }
            if(Tools.collision(peasants.get(1),peasants.get(2))) {
                peasants.get(1).x = peasants.get(1).getLastX();
                peasants.get(1).y = peasants.get(1).getLastY(); 
            }
            if(Tools.collision(peasants.get(1),peasants.get(0))) {
                peasants.get(1).x = peasants.get(1).getLastX();
                peasants.get(1).y = peasants.get(1).getLastY(); 
            }
            if(Tools.collision(peasants.get(2),peasants.get(1))) {
                peasants.get(2).x = peasants.get(2).getLastX();
                peasants.get(2).y = peasants.get(2).getLastY(); 
            }
            if(Tools.collision(peasants.get(2),peasants.get(0))) {
                peasants.get(2).x = peasants.get(2).getLastX();
                peasants.get(2).y = peasants.get(2).getLastY(); 
            }
Überleg doch mal, wenn man die Zahlen durch eine Schleife generieren kann...;)


In deiner equals-Methode castest du btw, bevor du prüfst, ob es die passende Klasse ist - das solltest du andersrum machen.
 

Javinner

Top Contributor
Ich würde von Rechteck nicht auf Rectangle schließen
Da aber Rectangle zu Deutsch Rechteck heißt und ein Rechteck als solcher angesehen wird, wenn alle seine Winkel rechte Winkel sind, auch die "Rechtecke", welche im Volksmund als Quadrate bekannt sind, sehe ich persönlich da kein wirklichen Unterschied. So, jetzt aber genug geklugscheißert, Zeit fürs Bett, in dem Sinn schönen Abend noch :)
 

mrBrown

Super-Moderator
Mitarbeiter
Da aber Rectangle zu Deutsch Rechteck heißt und ein Rechteck als solcher angesehen wird, wenn alle seine Winkel rechte Winkel sind, auch die "Rechtecke", welche im Volksmund als Quadrate bekannt sind, sehe ich persönlich da kein wirklichen Unterschied.
Okay, mein Satz in genauer: Rechteck nicht auf java.awt.Rectangle schließen :p
 

MoxxiManagarm

Top Contributor
if(Tools.collision(peasants.get(0),peasants.get(1))) {
peasants.get(0).x = peasants.get(0).getLastX();
peasants.get(0).y = peasants.get(0).getLastY();
}
//...
if(Tools.collision(peasants.get(1),peasants.get(0))) {
peasants.get(1).x = peasants.get(1).getLastX();
peasants.get(1).y = peasants.get(1).getLastY();
}

Ohne deine Semantik zu kennen macht das für mich perse nicht wirklich Sinn zu fragen ob A intersects B + B intersects A

if(peasants.get(p).equals(peasants.get(p))) {

Bitte was?
 

Eichelhäer

Bekanntes Mitglied
Naja, ich hab halt ne List mit allen Sprites und möchte die unterscheiden können. Das Problem ist halt das bei meinem Aufruf sich die Rechtecke selbst auf intersects prüfen und genau das möchte ich nicht. Stattdessen soll jedes Rechteck in der Liste als einziges angesehen werden.

Es macht schon Sinn, denn gehardcodet geht's ja.
 

Eichelhäer

Bekanntes Mitglied
Jedes Objekt in einer Liste unterscheidet sich nur durch seine ID.

Wenn ich aber mit equals prüfe zwei Rectecke sind verschieden wenn die id verschieden ist geht's auch nicht. Kein Plan warum?
 

Javinner

Top Contributor
@Eichelhäer
Prüfe doch, wie bereits erwähnt, mit hashcode(). Alternativ kann man noch mit compareTo(Object obj) prüfen, dazu musst du aber das Interface Comporable<T> implementieren.
Java:
public class Beispiel
{
    /** A */
    public static void main(String[] args)
    {
        int position_in_x = 10;
        int position_in_y = 10;
        Rechteck a = new Rechteck(position_in_x, position_in_y, 10, 10);
        Rechteck b = new Rechteck(position_in_x, position_in_y, 10, 10);
        System.out.println(a.compareTo(b));
        System.out.println(a.equals(b));
    }
/** Output */
0
true
}
Java:
public class Beispiel
{
    /** B */
    public static void main(String[] args)
    {
        int position_in_x = 10;
        int position_in_y = 10;
        Rechteck a = new Rechteck(position_in_x, position_in_y, 10, 10);
        Rechteck b = new Rechteck(position_in_x, position_in_y, 11, 10);
        System.out.println(a.compareTo(b));
        System.out.println(a.equals(b));
    }
/** Output */
-1
false
}

Wie willst du denn die Rechtecke prüfen, bzw. den die selbe ID zuweisen, wenn diese die gleichen Positionen und Maße haben?
 

Eichelhäer

Bekanntes Mitglied
HH,
Ok.
Bleiben wir bei den Rechtecken. Auf einem Spielfeld sind größengleiche Rechtecke an verschiedenen Positionen verteilt. Klickt man auf ein Rechteck, kann man es mit den Pfeiltasten bewegen. ich möchte halt nicht hundert einzelne Rechtecke per Hand eingeben und diese dann per Hand auf intersects prüfen was ja eig. gehen sollte (erstmal unabhängig von dem eigtl. sin ddahinter). Diese Rechtecke möchte ich alle in ner liste halten und eben mit möglichst wenig aufwand auf intersects prüfen. Wie gesagt gehardcodet geht ja.
 

temi

Top Contributor
Klickt man auf ein Rechteck, kann man es mit den Pfeiltasten bewegen.
Dann musst du ja schon mal nicht jedes Rechteck mit jedem anderen Rechteck vergleichen, sondern "nur" das eine, das sich bewegt, mit allen anderen.

peasants.intersectsWith(movingPeasant)

Die Methode "intersectsWith" musst du dir halt für die Klasse "Peasants" (die die Liste enthält) noch schreiben. Darin gehst du in einer Schleife einfach durch die Liste und vergleichst.

Java:
class Peasants {

    List<Peasant> peasants;

    public boolean intersectsWith(Peasant p) {
        for (Peasant peasant : peasants) {
            // ...
        }
    }
}
 
Zuletzt bearbeitet:

Eichelhäer

Bekanntes Mitglied
Jo. Ok.
Erstmal danke dafür. Ich denke ich habs soweit kapiert.
Allerdings hab ich jetzt ohne equals und hasCode zu überschreiben einfach direkt die ids verglichen in den schleifen und bekomm genau die werte die ich für die Bestimmung haben wollte (siehe hardcodet Variante die ich postete).

Hier kurz die schleifen:

Java:
       for(int i = 0;i<peasants.size();i++) {
            for(int j = 0;j<peasants.size();j++) {
                peasants.get(i).update();
                if(peasants.get(i).id!=peasants.get(j).id) {
                    System.out.println(peasants.get(i).id + "    " + peasants.get(j).id);
                    if(Tools.pixelCollision(peasants.get(peasants.get(i).id),peasants.get(peasants.get(j).id))) {
                        peasants.get(peasants.get(i).id).x = peasants.get(peasants.get(i).id).getLastX();
                        peasants.get(peasants.get(i).id).y = peasants.get(peasants.get(i).id).getLastY();
                        System.out.println(true);
                    }
                }
            }
        }

Die Kollision wird zwar erkannt, aber lastX greift nicht mehr.
Liegt das an der Laufzeit?
 

temi

Top Contributor

Eichelhäer

Bekanntes Mitglied
HHHHHHH,
Ich habs. Zu blöd wenn man update gleichzeitig mit aufruft.

Hier der Code:
Java:
for(int i = 0;i<peasants.size();i++) {
            peasants.get(i).update();
        }
       
        for(int i = 0;i<peasants.size();i++) {
            for(int j = 0;j<peasants.size();j++) {
                if(peasants.get(i).id!=peasants.get(j).id) {
                    if(Tools.pixelCollision(peasants.get(peasants.get(i).id),peasants.get(peasants.get(j).id))) {
                        peasants.get(peasants.get(i).id).x = peasants.get(peasants.get(i).id).getLastX();
                        peasants.get(peasants.get(i).id).y = peasants.get(peasants.get(i).id).getLastY();
                    }
                }
            }
        }

update Methode separat und gut is.

Vielen dank trotzdem an alle Thema hiermit geschlossen mir reicht das so. Auch wenn mich das mit hashCode und equals überschreiben interessiert hat. :)

Gruß Eichelhäer
 

Eichelhäer

Bekanntes Mitglied
Hallo mal wieder,
das mit der ID war doch keine gute Idee. Damit stößt man schnell an Grenzen für weitere Implementationen.
Ich habe ne Klasse die von Rectangle erbt. Wie muss ich denn die hashCode() bzw. die equals Methode überschreiben?
Also meine versuche schlugen fehl.
 

mihe7

Top Contributor
Schreib doch einfach mal, was Du jetzt eigentlich genau haben willst. Einmal schreibst Du von Rechtecken, dann kasperst Du mit irgendwelchen Sprites herum, dann geht es einmal um Überschneidungen aller Rechtecke, dann wieder nur von einem mit allen anderen usw. usw. Jetzt von Rectangle abgeleitete Klasse... Das kann doch nicht sein, dass man für ein (scheinbar) triviales Problem mittlerweile 34 Kommentare braucht und immer noch nicht weiß, was nun eigentlich rauskommen soll.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Warum kann ich so keine Elemente löschen und erhalte einen IllegalStateException? Allgemeine Java-Themen 4
JavaJüngling beliebige Collection die Comperable Elemente enthält als Parameter Allgemeine Java-Themen 37
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
H Elemente aus ArrayList in Array speichern Allgemeine Java-Themen 8
J In einem Set doppelte Elemente erzeugen Allgemeine Java-Themen 4
GreenTeaYT Elemente eines 2Dim LinkedList von links nach rechts ausgeben? Allgemeine Java-Themen 0
H ArrayList: Leere Elemente finden? Allgemeine Java-Themen 2
Streeber Probleme mit AWT-EventQueue: ArrayList Elemente hinzufügen Allgemeine Java-Themen 1
Z Elemente einer ArrayList von rechts wegnehmen Allgemeine Java-Themen 5
E ArrayList Anzahl der gleichen Elemente Allgemeine Java-Themen 4
K Neue Elemente in JList einfügen Allgemeine Java-Themen 2
A Collections Array-Elemente in ArrayList kopieren ohne Schleife Allgemeine Java-Themen 7
S GUI - Drag & Drop Elemente Allgemeine Java-Themen 10
J Elemente zu einer List hinzufügen? Allgemeine Java-Themen 9
T OpenOffice Interface Elemente Ein/Ausblenden Allgemeine Java-Themen 5
S Aus einer Liste<Oberklasse> alle Elemente die eine bestimmte Unterklasse von Oberklasse haben filter Allgemeine Java-Themen 8
D prüfen, ob Enums bestimmte Elemente enthalten Allgemeine Java-Themen 3
M Elemente aus ArrayList, die in ArrayList ist Allgemeine Java-Themen 2
Z Elemente einer HashTabelle gezielt ansprechen Allgemeine Java-Themen 10
S Alle Elemente von zwei Listen vergleichen Allgemeine Java-Themen 10
C Auf Oberflaechen Elemente zugreifen Allgemeine Java-Themen 8
H GUI: RectangleDrawer - zu viele Elemente im Vector für die paint-Methode Allgemeine Java-Themen 6
Iron Monkey Array-Elemente Allgemeine Java-Themen 9
S Array: Anzahl Elemente mit best. Wert zählen Allgemeine Java-Themen 4
R Elemente eines Vectors [Java 1.4] Allgemeine Java-Themen 5
B Liste auf gleiche Elemente untersuchen? Allgemeine Java-Themen 2
C Auf ArrayList Elemente referenzieren? Allgemeine Java-Themen 17
M Progblem bei Zugriff auf Array Elemente Allgemeine Java-Themen 4
der JoJo [TreeSelection] wie bekomme ich alle Elemente Allgemeine Java-Themen 4
G Alle Möglichkeiten n Elemente Anzuordnen. Allgemeine Java-Themen 13
M Elemente aus Liste entfernen? Allgemeine Java-Themen 7
Z Elemente in Vector nach Häufigkeit sortieren. Allgemeine Java-Themen 13
E Reihenfolge der Elemente einer ArrayList? Allgemeine Java-Themen 4
J Netbeans: wie auf grafische elemente zugreifen, andere Datei Allgemeine Java-Themen 2
B Nach Deserialisieren: Elemente des JFrames ohne Funktion Allgemeine Java-Themen 5
G Umkehrung der Array Elemente Allgemeine Java-Themen 2
K Elemente im ArrayList vergleichen Allgemeine Java-Themen 9
F Elemente überdecken sich! Allgemeine Java-Themen 13
G anzahl "verwendeter" elemente eines arrays ermitte Allgemeine Java-Themen 2
S alle elemente aus hashmap lesen Allgemeine Java-Themen 8
T Elemente eines Arrays mischen Allgemeine Java-Themen 5
C Collection, LinkedList, Elemente Allgemeine Java-Themen 4
S Einzelne Elemente in einer Bild Datei Allgemeine Java-Themen 5
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
Zrebna Möglichkeit regelmäßige indentation mittels/innerhalb Stringbuilder Allgemeine Java-Themen 14
ReinerCoder auf Klassen innerhalb eines package zugreifen Allgemeine Java-Themen 22
S Zugriff auf jUnit Test Suite Runner-Instanzen innerhalb von Test Classes Allgemeine Java-Themen 7
S Code 'innerhalb' des synchronen Bereichs einer BlockingQueue ausfuehren..? Allgemeine Java-Themen 7
M Nanosekunden-Pause innerhalb einen Thread-Loops Allgemeine Java-Themen 3
L Bilder innerhalb der JAR Datei Allgemeine Java-Themen 2
B Datei innerhalb des JARs von einer statischen Methode aufrufen Allgemeine Java-Themen 4
T Nur innerhalb des regex-Match ersetzen Allgemeine Java-Themen 9
A Navigation zu Files innerhalb jar Allgemeine Java-Themen 3
C Prüfen ob sich ein Punkt innerhalb einer Kugel befindet (Java3D,nicht-lineare GLS) Allgemeine Java-Themen 5
X Klassen innerhalb einer jar ersetzen Allgemeine Java-Themen 2
P Threads Thread innerhalb einer Klasse - ohne Extra Klasse Allgemeine Java-Themen 9
C 1500 Minuten innerhalb von 24h ?!?! Allgemeine Java-Themen 4
S groesstes Rechteck innerhalb eines Polygons/Shape finden..? Allgemeine Java-Themen 5
X Codeabarbeitung innerhalb des Hauptprogramms für bestimmte Zeit unterbrechen Allgemeine Java-Themen 2
M verschiedene Methonden innerhalb des gleichen Threads Allgemeine Java-Themen 7
J InvocationException im Thread (innerhalb von call() einer Callable Klasse) Allgemeine Java-Themen 2
J Directory/File Listing innerhalb JAR Allgemeine Java-Themen 2
P Serialisiertes Objekt innerhalb einer XML Node Allgemeine Java-Themen 25
M Innerhalb einer Jar in eine Txt schreiben Allgemeine Java-Themen 2
D Exe innerhalb einer Jar starten Allgemeine Java-Themen 10
U alle Dateien eines Ordners innerhalb einer JAR auflisten Allgemeine Java-Themen 6
N .jar innerhalb einer javaDatei starten Allgemeine Java-Themen 3
Luma Arbeitsverzeichnis innerhalb externen Bibliothek ändern Allgemeine Java-Themen 2
K MANIFEST.MF innerhalb einer JAR Datei lesen. Allgemeine Java-Themen 4
A Reflection - Variablen innerhalb einer Methode ermitteln Allgemeine Java-Themen 9
N Auf Bilder / Dateien innerhalb eines jar-Archives zugreifen Allgemeine Java-Themen 2
H Ein zufälliges Datum innerhalb eines Intervalles erzeugen Allgemeine Java-Themen 3
D Zahlen innerhalb eines Strings auslesen Allgemeine Java-Themen 3
D Suchfunktion innerhalb Jeditorpane Allgemeine Java-Themen 6
B java-version bestimmen innerhalb von Programm Allgemeine Java-Themen 4
A Verzeichnis auflisten - auch innerhalb eines Jars Allgemeine Java-Themen 6
M Datei innerhalb eines Zips ausführen? Allgemeine Java-Themen 4
P Perl innerhalb von Java ausführen Allgemeine Java-Themen 2
E Schaffe es einfach nicht daten innerhalb von 2 klassen zu üb Allgemeine Java-Themen 4
S konstruktor nur innerhalb der klasse aufrufbar Allgemeine Java-Themen 5
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
T JNA, Aufruf der Funktionen einer dll Allgemeine Java-Themen 5
I Vom Monolith zu Services in einer Webseite Allgemeine Java-Themen 1
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Wie kann ich den Wert aus einer If abfrage ausgeben Allgemeine Java-Themen 23
S HTML einer Webseite 1:1 so bekommen wie es auch der Browser anzeigt? Allgemeine Java-Themen 14
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
J (Geplante) Änderungen an einer Datei vorübergehend speichern und anwenden? Allgemeine Java-Themen 12
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
_user_q Obfuscate einer .jar-Datei mit ProGuard? Allgemeine Java-Themen 2
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20

Ähnliche Java Themen

Neue Themen


Oben