Index ermitteln (ArrayList-Objekte)

Mario

Grünschnabel
Servus,

ich habe hier schon die Suchfunktion benutzt, um evtl. eine Lösung für mein Problem zu finden, aber leider bin ich zu keinem Ergebnis gekommen. Deshalb stelle ich hier einfach mal meine Frage, in der Hoffnung, dass ich hier im richtigen Forum dafür bin.

Und zwar bezieht sich meine Frage auf ArrayLists. Ich möchte mir ein Objekt aus einer ArrayList ausgeben lassen und prüfen, ob es in einer 2. ArrayList vorhanden ist und dort ggf. Änderungen am Objekt vornehmen. Die Frage, die sich mir dabei stellt, ist folgende: Wenn ich das Objekt ändern möchte, benötige ich ja eine eindeutige Zuweisung (z.B. der Index). Ich habe schon in der API geschaut, aber nichts entsprechendes gefunden. Gibt es irgendwie eine Möglichkeit, die 2 ArrayLists zu vergleichen und den Index des Objekts in der 2. Liste zurückzugeben, so dass ich dort das Objekt bearbeiten/updaten kann?
Bisher habe ich Objekte in Listen immer mit der Angabe eines vorgegebenen Index-Wertes (ArrayList.get(0)) bearbeitet. Da ich aber den Index-Wert nicht immer kenne, wäre eine Ermittlung eben jenes Wertes wünschenswert. Oder gibt es da andere Möglichkeiten und ich bin auf dem Holzweg?

Danke schonmal für evtl. Antworten und bis dann

Mario
 
Das heißt, Du kennst das Objekt in der ersten Liste und willst wissen, ob es auch in der zweiten enthalten ist? Dafür gibt's die Methode contains(). Und da ich nicht annehme, dass Du die Objekte für die zweite Liste jeweils kopierst, enthält diese 'nur' Referenzen auf diese Objekt. D.h. es spielt keine Rolle, aus welcher Liste Du Dir das Objekt holst und dann änderst.

Java:
obj1 = list1.get(0);

if (list2.contains(obj1))
  obj1.setName("neuer Name");

PS. Und zudem gibts die Methode indexOf().
 
Danke für die Antwort. Du hast Recht. Die Objekte der 2. Liste sind Referenzen zu den Objekten der ersten Liste. Ich habe deine Variante ausprobiert, komme aber nicht so richtig weiter. Ich habe es auf diese Art und Weise versucht:

Java:
private static void vergleicheObjekte(Test o1)  {
		if(ObjektvergleichMain.liste1.contains(o1)) {
			System.out.println("Objekt enthalten!");
			...
		}
	}

Das Objekt o1 ist dabei eigentlich ein Objekt vom Typ "Test", welches an die Methode übergeben werden soll. Liste1 enthält mehrere Objekte vom Typ "Test" und auch definitiv die übergebenen Objekte (o1). Dennoch erhalte ich als Rückgabewert "false", obwohl er das Objekt finden müsste. Liegt es eventuell daran, dass das übergebene Objekt bei der Übergabe gecastet wird (Test o1 - keine Ahnung ob man das Cast nennt) und Liste1 nur die Objekte vom Typ Test ohne Cast (s.u.) enthält?

Java:
ArrayList<Test> liste1 = new ArrayList<Test>();
liste1.add(new Test(...))

Ich weiß, dass die Problembeschreibung für erfahrene Programmierer sicher etwas "holprig" klingen mag, aber vielleicht wird ja einigermaßen ersichtlich, worauf ich hinaus möchte.
 
Zuletzt bearbeitet:
Zeig mal her, wie Du die Methode vergleicheObjekte() im Code aufrufst. Ich nehme nämlich an, dass Du beim Aufruf ein neues Objekt erzeugst:

Java:
vergleicheObjekte(new Test(...));

Auch wenn dieses Test-Objekt diesselben Attribute hat wie eins, das in Deiner Liste vorhanden ist, handelt es sich um verschiedene Objekte. Poste einfach mal Deinen kompletten Code, dann kann man Dir helfen.
 
Du wirst immer neue Objekte in beide Listen stecken...

Guck dir mal mein Beispiel an:

Java:
import java.util.ArrayList;
import java.util.List;

public class Test {

	List<TestObject> list1;
	List<TestObject> list2;
	public static void main(String[] args) {
		Test t = new Test();
	    t.run(10);
	}
	
	public Test(){
	    list1 = new ArrayList<TestObject>();
	    list2 = new ArrayList<TestObject>();
	}
	
	public void run(int limit){
		for(int i = 1; i <= limit; i++){
			TestObject t = new TestObject(i);
			list1.add(t);
			if (i % 2 == 0){
				list2.add(t);
			}
		}
		for(TestObject t : list1){
			vergleicheObjekte(t);
		}	
	}
	
	
	private void vergleicheObjekte(TestObject o1)  {
            if(list2.contains(o1)) {
                System.out.println("Objekt "+o1.getI()+" enthalten @ index "+list2.indexOf(o1));
            } else {
        	System.out.println("Objekt "+o1.getI()+" nicht enthalten!");
            }
       }

	private class TestObject{
		int i;
		public int getI() {
			return i;
		}
		public TestObject(int i){
			this.i = i;
		}
	}
}

Ausgabe:
Objekt 1 nicht enthalten!
Objekt 2 enthalten @ index 0
Objekt 3 nicht enthalten!
Objekt 4 enthalten @ index 1
Objekt 5 nicht enthalten!
Objekt 6 enthalten @ index 2
Objekt 7 nicht enthalten!
Objekt 8 enthalten @ index 3
Objekt 9 nicht enthalten!
Objekt 10 enthalten @ index 4

Viele Grüße
f.
 
Zuletzt bearbeitet:
Hallo Mario,

Du hattest weiter oben geschrieben, dass es mit liste.contains(object) nicht klappt. Das liegt daran, dass deine Klasse TestObject die equals Methode nicht überschreibt. Wenn Du die contains Methode deiner Array-Liste aufrufst, fragt die Liste jedes Object, das in ihr enthalten ist, ob dessen .equal wahr zurück gibt, wenn es für das Objekt ausgeführt wird, dass Du in das contains reinsteckst.

Equals erbst Du, ob Du das willst oder nicht, von Object. Das ist die "Mutter" aller Klassen. Jede Klasse die Du jemals anlegen wirst erweitert Object (public class MeineKlasse extends Object), wenn Du nichts anderes angibst. Nur steht es nicht explizit da. Mehr dazu steht im Java Tutorial (Object as a Superclass).

Wenn Du deinem Test ein equals spendierst, geht es auch mit den Java Bordmitteln.
Code:
private class Test {
       
        // ... dein ganzer restlicher Code.

        public boolean equals(Object otherObject) {
              // TODO: Prüfe ob otherObject vom gleichen Typ ist, per getClass()
              // TODO: Vergleiche die relevanten Attribute von this mit denen von otherObject und entscheide ob beide Objekte gleich sind.
        }
    }

Edit: Asche auf mein Haupt, habe die Posts von Mario & fassy verwechselt.
 
Zuletzt bearbeitet:
equals musst du in diesem Fall nur überschreiben wenn du in jede ArrayList verschiedene Objekte mit den selben Feldwerten vergleichen willst. Solange du in beiden ArrayListen die gleichen Object hast (bzw Referenzen auf Objekte) ist da überflüssig und bringt gar nichts.
 
Dann hätte es doch mit contains (siehe Marios Post #2) klappen müssen, oder? So wie er sein Problem beschreibt, hat er nicht die gleichen, sondern die selben Objekte in seinen Listen.

Und das es überflüssig ist equals zu implementieren und zu verstehen ... halte ich für gewagt :)
 
Das er nicht die gleichen Objekte hat ist ja die Vermutung. Wenn er die gleichen hätte würde contains funktionieren - auch ohne equals zu implementieren. Ist halt die Frage was er vorhatte - zwei Listen mit den den gleichen Objekten vergleichen wie in meinem Beispiel oder zwei Listen mit unterschiedlichen aber wertgleichen Objekten vergleichen.

Das es in vielen Fällen richtig und wichtig ist equals und hashCode zu implementieren ist ein anderer Punkt.
 

Neue Beiträge

Zurück