In List Rekursiv suchen

Fohnbit

Top Contributor
Hallo,

wie macht man am besten eine List, in der man rekursiv suchen kann?
Ich habe folgende Klasse:
Code:
public class OdooCategory {
    private Integer id;
    private String name;
    private String description;
    private Integer parentCategoryId;
    private long lastChange;
    private Integer magentoCategoryId;
    private Integer magentoParentCategoryId;
    private String image;
    private List<OdooCategory> odooCategory;
}

Die Klasse enthält also eine weitere Liste mit dem Objekt "OdooCategory" und diese kann wiederum weitere enthalten.

Die Klasse ist also verschachtelt.

Nun muss ich aber über alle Objekte suchen.

Beispiel, ich muss String "name" irgendwo den Inhalt "Demo user" hat.
Würde ich mal so machen:
Java:
private static boolean searchForNameInCategory(List<OdooCategory> localCategoryList, String searchString) {
        Iterator<OdooCategory> iterator = localCategoryList.iterator();
        while (iterator.hasNext()) {
            OdooCategory localCategory = iterator.next();
            if(localCategory.getName().equals(searchString)
               return true;
             if (localCategory.getOdooCategory() != null) {
                searchForNameInCategory(localCategory.getOdooCategory(), searchString);
             }
    }
}

Aber ich würde zum Beispiel alle OdooCategory benötigen, die "lastChange > now()" haben, usw.

Ist da eine List das passende oder wie baut man so etwas auf?
Und kann ich die Methoden in die Klasse "OdooCategory" packen? Denk nicht, da nicht rekursiv möglich.
 
Zuletzt bearbeitet von einem Moderator:

mrBrown

Super-Moderator
Mitarbeiter
Ist da eine List das passende oder wie baut man so etwas auf?
Naja, ob eine List die passende Datenstruktur ist, sollte erstmal von deinem Model abhängen, und nicht von einer möglichen Suchfunktion auf diesem ;)

Und kann ich die Methoden in die Klasse "OdooCategory" packen? Denk nicht, da nicht rekursiv möglich.
Warum sollte man die Methode nicht in OdooCategory schreiben können, rekursiv oder nicht ist dafür doch völlig egal?



Würde ich mal so machen:
Warum Iterator direkt benutzen, mit erweiterten for-schliefen gehts doch deutlich einfacher ;)

Java:
private static boolean searchForNameInCategory(List<OdooCategory> localCategoryList, String searchString) {
        for (OdooCategory localCategory : localCategoryList) {
            if(localCategory.getName().equals(searchString))
               return true;
             if (localCategory.getOdooCategory() != null) {
                searchForNameInCategory(localCategory.getOdooCategory(), searchString);
             }
    }
}
Scheitern wird das aber daran, das du das Ergebnis des rekursiven Aufrufs nicht benutzt.

Deutlich leichter wird das, wenn die Suche eine Methode von OdooCategory wird, etwa so:
Java:
private boolean searchForNameInCategory(String searchString) {
    for (OdooCategory localCategory : localCategoryList) {
        if(localCategory.getName().equals(searchString)  //entweder localCategory ist das gesuchte
                || localCategory.searchForNameInCategory(searchString)) { // oder enthält das gesuchte
            return true;
        }
    }
    return false;
}
 

Fohnbit

Top Contributor
Hallo,

vielen Dank ... aber so ganz habe ich dein letztes Beispiel nicht verstanden:
Du packst die Methode in die Klasse?
Und durch die Methode "searchForNameInCategory" in der obersten Ebene wird das rekursiv "durchgereicht"?
 

Fohnbit

Top Contributor
Ok, das habe ich nun verstanden. Vielen Dank!

Jedoch wenn ich die gefundene Klasse zurückgeben:
Code:
public OdooCategory searchByNameInCategory(String searchString) {
        for (OdooCategory localCategory : odooCategory) {
            if (localCategory.getName().equals(searchString)
                    || (localCategory.searchByNameInCategory(searchString) != null)) {
                return localCategory;
            }
        }
        return null;
    }
Hier bekomme ich aber nicht aus der Rekursion das Objekt zurück oder?
(localCategory.searchByNameInCategory(searchString) != null)
ist ja nur ein Vergleich.

Wäre dies richtig?:
Code:
    public OdooCategory searchByNameInCategory(String searchString) {
        for (OdooCategory localCategory : odooCategory) {
            if (!localCategory.getName().equals(searchString)) {
                return localCategory.searchByNameInCategory(searchString);
            } else {
                return localCategory;
            }
        }
        return null;
    }
Beim ersten Treffer wird das Objekt zurück gegeben, ansonsten null?
 

mrBrown

Super-Moderator
Mitarbeiter
Wenn das Objekt zurückgegeben werden muss, muss man das etwas anders aufbauen.

Die relevanten Fälle sind:
* localCategory.getName() ist der gesuchte Name -> localCategory zurückgeben
* Sonst:
** wenn localCategory.searchByNameInCategory etwas zurückgibt -> dies zurückgeben
* sonst:
** nichts machen.


Aktuell hast du:
* localCategory.getName() ist der gesuchte Name -> du gibst das Ergebnis von localCategory.searchByNameInCategory zurück
*sonst (localCategory.getName() ist *nicht* der gesuchte Name) -> du gibst localCategory zurück.
 

Fohnbit

Top Contributor
hmmm ... hast du den "!" inverter gesehen?
Ich meinte, wenn nichts gefunden wird, sucht er rekursiv weiter.
Wenn gefunden,gibt er das Objekt zurück.
 

mrBrown

Super-Moderator
Mitarbeiter
Oh, stimmt - übersehene.
Aber das Problem bleibt:

* localCategory.getName() ist nicht der gesuchte Name -> du gibst das Ergebnis von localCategory.searchByNameInCategory zurück
*sonst (localCategory.getName() ist der gesuchte Name) -> du gibst localCategory zurück.

Du betrachtest also nur die aller erste Category in der Liste.
 

Fohnbit

Top Contributor
Neuer Versuch:
Code:
public OdooCategory searchByNameInCategory(String searchString) {
        for (OdooCategory localCategory : odooCategory) {
            if (!localCategory.getName().equals(searchString)) {
                localCategory.searchByNameInCategory(searchString);
            } else {
                return localCategory;
            }
        }
        return null;
    }

Ich dachte ich muss, wenn ich die Rekursion aufrufe, das Ergebnis immer bis zum Anfang zurückreichen.
 

mrBrown

Super-Moderator
Mitarbeiter
Ja, musst du. *Wenn* es ein Ergebnis gibt. localCategory.searchByNameInCategory kann aber auch null zurückgeben (was ja "nicht gefunden" bedeutet)
 

Fohnbit

Top Contributor
OK, ich denk so paßt das:
Code:
    public OdooCategory searchforWebIdByIdInCategory(int id) {
        if (getMagentoCategoryId() != id) {
            if (odooCategory != null) {
                for (OdooCategory localCategory : odooCategory) {
                    OdooCategory oc = localCategory.searchforWebIdByIdInCategory(id);
                    if (oc != null) {
                        return oc;
                    }
                }
            }
        } else {
            return this;
        }
        return null;
    }
 

Fohnbit

Top Contributor
Ja, keine Fehler :)

Code:
if (oc != null) {
                        return oc;
                    }
Die Abfrage musste ich reinpacken, sonst hat er mir in der List immer nur den ersten Eintrag verarbeitet und dann zurückgemeldet.
Mit diesem wartet er solange bis das Ende erreicht ist oder ein Eintrag gefunden wurde.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
J Array.list vergleichen Java Basics - Anfänger-Themen 1
B Vektor vs List Java Basics - Anfänger-Themen 4
volcanos Addition -> List<Integer> mit Arrays.asList() versus List<Integer>ArrayList<>() Java Basics - Anfänger-Themen 14
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
T Linked List set-Methode Java Basics - Anfänger-Themen 2
volcanos List & ArrayList nach Familiennamen abfragen Java Basics - Anfänger-Themen 57
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
L Datentypen Array List Java Basics - Anfänger-Themen 9
J Java List, Bitte um Hilfe Java Basics - Anfänger-Themen 15
J Java List, bitte um Hilfe Java Basics - Anfänger-Themen 3
F GSON file mit einer List erstellen Java Basics - Anfänger-Themen 2
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
O Collections.sort und List.sort mit Lambda Verwirrung Java Basics - Anfänger-Themen 5
J String Array zu Map<Character, List<Character>> mit Streams Java Basics - Anfänger-Themen 1
G Linked list, Methode zum Vertauschen von Elementen Java Basics - Anfänger-Themen 14
I csv auslesen, mittels List Java Basics - Anfänger-Themen 18
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
I Methoden List.contains() beim 2. Element = true Java Basics - Anfänger-Themen 1
N HashMap in List good practice? Java Basics - Anfänger-Themen 2
B SWAP List; Liste neu anordnen Java Basics - Anfänger-Themen 4
W Stream Array List - Frage Java Basics - Anfänger-Themen 5
E Interface List nicht als Collection an erkannt. Java Basics - Anfänger-Themen 14
X Array List geordnet ausgeben. (JSF und JAVA) Java Basics - Anfänger-Themen 1
D new arraylist (List) dynamisch erstellen Java Basics - Anfänger-Themen 1
Yjuq Generic Methode - Wie muss die List Definition aussehen? Java Basics - Anfänger-Themen 3
M List<String> auswählen Java Basics - Anfänger-Themen 42
B Unterschied zwischen (List<T> a) und (T[] a) Java Basics - Anfänger-Themen 7
T HashSet in List-Object Java Basics - Anfänger-Themen 5
B ENUM to List<String> konvertieren Java Basics - Anfänger-Themen 2
E Array-list mit einer bestimmten Länge Java Basics - Anfänger-Themen 17
B Sorting List und Remove Java Basics - Anfänger-Themen 2
B String: suche nach Wörter und in List<String> speichern Java Basics - Anfänger-Themen 3
M Methode überladen - Array List Java Basics - Anfänger-Themen 5
L LIST.ADD Java Basics - Anfänger-Themen 2
M XWPF - Bullet Point list erstellen Java Basics - Anfänger-Themen 1
I <List> sortieren Java Basics - Anfänger-Themen 2
N Klassen List-Art Java Basics - Anfänger-Themen 5
S List<T<X,Y> sortieren Java Basics - Anfänger-Themen 5
Salo Datentypen "Doppelt" List(e) ("gesucht") Java Basics - Anfänger-Themen 6
F .csv Export aus einer list Java Basics - Anfänger-Themen 25
T KlausurÜbung- Förderband-Linked List Java Basics - Anfänger-Themen 53
D Komischer Fehler nach <Integer> List Java Basics - Anfänger-Themen 2
B in einem abstrakten Set ,Elemente einer einfache verkettete List epeichern Java Basics - Anfänger-Themen 13
T List und ArrayList Java Basics - Anfänger-Themen 3
UnityFriday method getPrevious in class List<ContentType> cannot be applied to given types Java Basics - Anfänger-Themen 29
hooked Verkettete Liste / linked list Java Basics - Anfänger-Themen 2
T Datentypen InputStream to list of Int (or similar) Java Basics - Anfänger-Themen 4
D Input/Output CSV Parser list unvollständig Java Basics - Anfänger-Themen 25
V Erste Schritte Dateinamen aus einer FIle[] in eine List Java Basics - Anfänger-Themen 11
S Methoden Linked List Methoden können nicht aufgerufen werden Java Basics - Anfänger-Themen 1
U JAXB - List wird nicht ausgefüllt Java Basics - Anfänger-Themen 1
L Linked List - Array List Java Basics - Anfänger-Themen 2
J Einfach verkettet List: Ausgabe ohne null Java Basics - Anfänger-Themen 11
D Bestimmten Wert aus Array List ausgeben Java Basics - Anfänger-Themen 7
V Personenverwaltung mit List<>, falsche Ausgaben Java Basics - Anfänger-Themen 5
M List befüllen Java Basics - Anfänger-Themen 3
S Datentypen List.toString wirft NullPointerException Java Basics - Anfänger-Themen 5
P Anlegen und Abfragen von Array List Java Basics - Anfänger-Themen 4
S Element von List<E> in String umwandeln Java Basics - Anfänger-Themen 3
A Wie nutze ich List<List<String>> Java Basics - Anfänger-Themen 4
M Endlos schleife in List Java Basics - Anfänger-Themen 5
P Zufallszahlen ohne zahlen einer List Java Basics - Anfänger-Themen 21
C Array List mit String vergleichen und Fehlermeldung ausgeben Java Basics - Anfänger-Themen 6
S Probleme bei Ausgabe von rekursiver Methode (List) Java Basics - Anfänger-Themen 16
T Tabstopp in AWT-List? Java Basics - Anfänger-Themen 8
P Doppelte Einträge in eine List Java Basics - Anfänger-Themen 5
M Wozu Upcasting? Am Beispiel List = ArrayList Java Basics - Anfänger-Themen 2
A List mit integern füllen Java Basics - Anfänger-Themen 4
D sortieren von List<> Java Basics - Anfänger-Themen 2
B List - Drag&Drop Java Basics - Anfänger-Themen 8
SexyPenny90 Implementierung einer doubly linked list Java Basics - Anfänger-Themen 5
G Linked List Programm add Problem Java Basics - Anfänger-Themen 5
C List Abfragenproblem Java Basics - Anfänger-Themen 3
J List als anonyme Klasse Java Basics - Anfänger-Themen 9
H Collections List in List<SpecificType> als stat. generische Methode zurückgeben Java Basics - Anfänger-Themen 4
F Wozu braucht man array list? Java Basics - Anfänger-Themen 29
T Collections Wie funktioniert List() ? Java Basics - Anfänger-Themen 7
Kenan89 Java Date List Java Basics - Anfänger-Themen 4
tux20 Problem beim Schreiben von List to File Java Basics - Anfänger-Themen 2
K Frage Set List Java Basics - Anfänger-Themen 3
M Array List ausgeben Java Basics - Anfänger-Themen 13
C Typen aus List<Object[]> ändern Java Basics - Anfänger-Themen 7
S Gute List Implementation Java Basics - Anfänger-Themen 5
S Synchronisieren einer Linked List Java Basics - Anfänger-Themen 16
A List Array - wie instanzieren Java Basics - Anfänger-Themen 7
T List mit mehreren gleichen Strings bereinigen Java Basics - Anfänger-Themen 4
R List to BinaryTree Java Basics - Anfänger-Themen 13
P Set mit List vergleichen Java Basics - Anfänger-Themen 8
Binary.Coder List bzw. ArrayList als String ausgeben Java Basics - Anfänger-Themen 2
J Datentypen List - gleiche Einträge bei neuen Objekten Java Basics - Anfänger-Themen 31
T List.add(Object) führt zu NullPointerException Java Basics - Anfänger-Themen 14
M Collections Cast bei ArrayList (List) Java Basics - Anfänger-Themen 2
B List list - anstatt ArrayList list = new ArrayList Java Basics - Anfänger-Themen 10
H Remove Methode von List Java Basics - Anfänger-Themen 6
T Datentypen List<?> Java Basics - Anfänger-Themen 5
E Linked List generisch Java Basics - Anfänger-Themen 5
S Einen neuen String ohne Array oder List erzeugen??? Java Basics - Anfänger-Themen 13
S List angaben in textfelder Java Basics - Anfänger-Themen 7
D List<String[]> initialisieren Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben