Java Rekursionsproblem in über csv-Datei erstellte Liste

raffiSSL

Lt. Junior Grade
Registriert
Feb. 2006
Beiträge
289
Hallo,

ich möchte gern mit einer rekursiven Methode einen bestimmten Wert aus einer Liste herauslesen, welcher sich aus einem Input-Wert ergibt. Ganz konkret lese ich mittels smooks eine csv-Datei ein und erstelle damit eine Liste mit Einträgen der Klasse CategoryHierarchy. Diese wiederum hat 2 Werte, cid und cidParent (beide long), welche direkt aus der csv Datei kommen. Dort ist eine, wie der Name schon sagt, baumartige Hierarchie hinterlegt. Und ich möchte für jeden Inhalt den Wurzelknoten wissen (es kann natürlich passieren, das pid == root).
Ich versuche das ganze folgendermaßen, wobei mir immer nur der erste Elternknoten zurückgegeben wird, anstatt den Baum bis ganz nach oben zu wandern:
Code:
	public static void main(String[] args) throws IOException, SAXException {
		List<CategoryHierarchy> catHier = Main.runsSmooksTransformCategoryHierarchies();
		
		Long cid = Long.valueOf(110040202);
		long root = getRoot(cid, catHier);
		
		System.out.println("Root: "+root);
	}
	
	

	private static long getRoot(Long cid, List<CategoryHierarchy> list) {
		for (CategoryHierarchy ch : list) {
			Long temp = Long.valueOf(ch.getCid());
			if (temp.compareTo(cid) == 0) {
				cid = Long.valueOf(ch.getCidParent());
				getRoot(cid, list);
			}
		}
		return cid.longValue();
	}

Im konreten Fall wird mir 1100402 als Wurzel angezeigt. Richtig wäre aber 110 (diesen Wert gibt es nur als cidParent und nie als cid).
Aufbau der CategoryHierarchy-Klasse:
Code:
public class CategoryHierarchy {

	private long cid;
	private long cidParent;
...
}

Aufbau der csv:
cid|cidParent
11032|110
11004|110
1100402|11004
110040202|1100402
110040204|1100402
110040206|1100402
...

Ich weis nicht wirklich wo das Problem liegt. Aber ich kann es zumindest eingrenzen, als das es funktioniert, wenn ich eine Liste mit CategoryHierarchy-Instanzen mit manuell eingetragenen Werten anlege. Das Einlesen der csv funtioniert korrekt, was ich am HTML Report sehen kann.

Danke und viele Grüße
 
Parse dir doch deine CSV in eine

Code:
Map<Long, Long> myMap = new HashMap<Long, Long>();

und dann machst du

Code:
long cid=110040206;

while(map.containsKey(cid)) {
    cid = myMap.get(cid);
}

System.out.println("Root: " + cid);

Ich hab es grad mal in einer Testklasse durchgespielt:
Code:
import java.util.HashMap;
import java.util.Map;

public class RootFinder {
    public static void main(String[] args) {
        Map<Long, Long> map = new HashMap<Long, Long>();
        map.put(11032l,110l);
        map.put(11004l,110l);
        map.put(1100402l,11004l);
        map.put(110040202l,1100402l);
        map.put(110040204l,1100402l);
        map.put(110040206l,1100402l);
        
        Long cid=110040206l;
        
        while(map.containsKey(cid)) {
            cid = map.get(cid);
        }
         
        System.out.println("Root: " + cid);
    }
}

Root: 110

Sowas hier ist übrigens überflüssig:
Code:
Long cid = Long.valueOf(110040202);

Einfach ein kleines "l" hinter die Zahl:
Code:
Long cid =110040202l;
oder
Code:
Long cid = new Long(110040202);
 
Zuletzt bearbeitet:
Hallo und danke, das klappt so tatsächlich wie gewünscht. Gefühlt scheint es auch etwas performanter zu sein und ich spare mir die extra Klasse.

Viele Grüße :)
 
Zurück
Oben