Objekt aus Liste in Liste suchen/löschen

MrTobi

Mitglied
Hallo ich habe mal wieder eine Frage.
Folgendes Problem:

Ich habe eine Liste mit eigenen Objekten welche bestimmte Eigenschaften haben.

[Java]List<DataHolder> listinputHolders = myparser.readInputExcel();[/Java]

Nun Sind die Objekte folgender maßen aufgebaut:

Java:
public class DataHolder {
	private String sMatnr;
	private int iWFG;
	private String sPlaner;
	private List<String> lAplNr = new ArrayList<String>();

             public List<String> getlAplNr() {
		return lAplNr;
	}
	
             public void setlAplNr(String lAplNr) {
		this.lAplNr.add(lAplNr);
	}

+ Restliche Getter/Setter/Konstruktoren

Nun will ich folgendes machen: Alle Objekte, die die selbe sMatnr haben sollen zu einem Objekt zusammengeführt werden und in der orginal Liste gelöscht werden.

z.b: Objekt 1 : sMatnr = "AG12"
iWFG = 102
sPlaner = "KL"
lAplNr{01-000} (Inhalt der Liste als Verdeutlichung)

Objekt 2 : sMatnr = "AG12"
iWFG = 102
sPlaner = "KL"
lAplNr{01-100} (Inhalt der Liste als Verdeutlichung)


Objekt 3 : sMatnr = "AG12"
iWFG = 102
sPlaner = "KL"
lAplNr{01-200} (Inhalt der Liste als Verdeutlichung)

-> Zusammengeführtes Objekt:

sMatnr = "AG12"
iWFG = 102
sPlaner = "KL"
lAplNr{01-000, 01-100, 01-200} (Inhalt der Liste als Verdeutlichung)


Am Ende will ich praktisch eine Liste haben wo es keine Objekte mehr gibt die die selbe sMatnr haben, und eben die lAplNr zusammengeführt sind.

Ich hab was versucht aber das gibt immer nur Objekte mit maximal 2 lAplNr zurück.

Java:
for(int i = 0; i <inputHolders.size();i++ ){
			
			for(int a = 1; a < inputHolders.size();a++){
				
				if((inputHolders.get(i).getsMatnr()).equals((inputHolders.get(a).getsMatnr()))){
					inputHolders.get(i).setlAplNr((inputHolders.get(a).getlAplNr()).get(0));
					inputHolders.remove(inputHolders.get(a));
					
					
				}
			}
			
		}

Ich seh den Fehler nicht. Hab auch schon den Degugger heiß laufen lassen

Für eure Hilfe bin ich wie immer sehr dankbar.

Mit freundlichen Grüßen
MrTobi
 
Mit deiner Methode wirst du doch alle (bis auf das erste) Elemente mit sich selbst vergleichen (z.B. i = 1; a = 1) und der Vergleich wird immer true liefern. Elemente aus einer Liste zu entfernen, die du mit einer Variable iterierst, kann auch nur schief gehen (i wird immer um eins erhöht. Löscht du ein Element in der Mitte, überspringst du dein nächstes Element, da alle nachfolgenden nachgerückt sind).

Erstelle eine neue Liste. Gehe deine ursprüngliche Liste durch und schaue, ob die ID bereits vorhanden ist. Falls ja, füge die lAplNr hinzu, ansonsten den ganzen Eintrag.
 
Ich hab nun deine Variante mal versucht allerdings bleibt das Ergebnis das selbe. Kannst du eventuell etwas ganauer auf deinen Vorschlag eingehen ich vermute ich hab ihn falsch umgesetzt.

Wäre super nett 🙂

Java:
List<DataHolder> lsortedHolders = new ArrayList<DataHolder>();
		lsortedHolders.add(inputHolders.remove(0));
		
		for(int i = 0; i <lsortedHolders.size();i++ ){

			for(int a = 0; a < inputHolders.size();a++){
				
				if(lsortedHolders.get(i).getsMatnr().equals(inputHolders.get(a).getsMatnr())){
					
					lsortedHolders.get(i).setlAplNr(inputHolders.get(a).getlAplNr());
					inputHolders.remove(inputHolders.get(a));
					a=0;
				}else{
					lsortedHolders.add(inputHolders.remove(a));
					a=0;
				}
			}
		}

Nur das Ankucken ich hab die lAplNr Listen in DataHolder durch Strings ersetzt (fals sich jemand wundert wie die nun hinzugefügt werden)
 
Zunächst eine exists-Methode (ungetestet):

Java:
int exists(DataHolder dataHolder, List<DataHolder> list){
    for (int i = 0; i<list.size(); i++){
		if (list.get(i).getsMatnr().equals(dataHolder.getsMatnr()))
			return i;
		}
	return -1;
}

Liefert -1, falls das Element nicht in der Liste vorhanden ist, ansonsten dessen Position.

Nun gehst du inputHolders durch und wendest diese Methode auf jedes Element an. Bei "-1" kannst du es hinzufügen, ansonsten fügst du deine lAplNr dem Element zu (deswegen auch int als Rückgabewert).
 
Du könntest in deiner Datenklasse die Methode

Java:
public boolean equals(Object o)
überschreiben, sowie bei der Liste die add-Methode..

Die equals Methode liefert dann true zurück, wenn die lApNr die gleiche ist (musst halt noch schnell implementieren)

In der add Methode machst du zuerst ein indexOf(o) um den Index zu ermitteln! Falls nicht -1, dann hol das von dem Index und adde die Daten dazu, ansonsten mach ein super.add!

So ungefähr:
Java:
        List<DataHolder> list = new Vector<DataHolder>(){
        	public boolean add(DataHoldero)
        	{
        		int tmpIndex = indexOf(o);
        		if(tmpIndex != -1)
        		{
        			DataHolder tmp = get(tmpIndex);
        			//hier die Werte addieren/seten, etc. -> nochmals muss du es nicht in die Liste speichern, weil es ja das gleiche Objekt ist
        			return true;
        		}
        		//falls nicht gefunden, dann fuege es in die Liste ein
        		else
        			return super.add(o);
        	}
        };
 
Ich würde mir eine Wrapperklasse schreiben, die all diese Daten hält und per getKey() einen Schlüssel liefert.
Dann packt man das ganze in eine HashMap/HashTable/HashSet je nach geschmack und kann über den Key zugreifen.
In die Wrapperklasse kommt dann noch eine add-Methode, die dann deine lAplNr zusammensetzt.

Vorteil ist 1. der einfache Vergleich per Key und du hast mehr Kontrolle über das Zusammenfügen, weil es die Wrapperklasse selbst übernimmt.

Gruß Vanny
 
Zuletzt bearbeitet von einem Moderator:
Hi erstmal vielen Dank für die vielen Antworten.
Ich hab jetzt die euqals-Methode überschrieben und dann wie zu Beginn von darekkay vorgeschlagen 2 Listen benutzt. Nun funktioniert das ganze.

Vielen Dank an euch wie immer sehr gute Hilfestellungen.

Grüße
MrTobi
 

Zurück
Oben