ajgon Opublikowano 23 Sierpnia 2005 Zgłoś Opublikowano 23 Sierpnia 2005 (edytowane) Skrobie sobie ostatnio w javie programik, do parsowania plikow Kconfig. Postanowilem to wszystko oprzec o klase DefaultMutableTreeNode, gdyz jej drzewiasta struktura idealnie sie do tego nadaje. I napotkalem problem przy indexowaniu - mianowicie, jak policzyc wszystkie nody, liscie, dzieci i cale te bajery w drzewie ? getChildCount() zwraca tylko liczbe dzieci danej galezi, a ja chce wszystkie dzieci z galezi, podgalezi i jeszce podpodgalezi 8). Probowalem to zrobic mniej - wiecej tak: PHP child = parse(new FileReader(value), index, _leafs);dzieci = child.getChildCount(); while(k < dzieci) { pointer.add((DefaultMutableTreeNode)(child.getNextNode())); k++; } while(child.getChildCount() != 0) { child = (DefaultMutableTreeNode)child.getChildAt(child.getChildCount() - 1); } index = ((Field)tmp.getUserObject()).getId() + 1; Pierwszy while, leci po drzewie zwroconym przez parse i dodaje go do obecnie uzywanego drzewa (pointer jest typu DefaultMutableTreeNode). I tu jest zonk - getNextNode() nie wiem czy w kulki sobie leci, czy co, ale ono chyba kasuje te nody ktore odczyta. A jak nie ono, to add. Bo po tym while, child jest puste :mur: I dlatego nie moge wywolac drugiego while, ktorej celem jest zejscie do ostatniego dziecka jakie jest i wyciagnieciu jego id (potrzebnego do indexowania). I tutaj moje pytanie - jak to rozwiazac? a ) Czy da sie, jakos tak pododawac drzewo child, zeby nie zostac z pusta zmienna b ) Czy moze da sie jakos zrobic kopie child (kopie a nie referencje). Glupi DefaultMutableTreeNode nie ma konstruktora kopiujacego, wiec tmp = new DefaultMutableTreeNode(child), nie przejdzie, a tmp = child zrobi mi tylko referencje :mur: . Parsowanie drugi raz do tmp, to jest idiotyzm - java jest wystarczajaco wolna, po co obciazac jeszcze algorytm c ) Czy tez moze istnieje jakas metoda do zliczania wszystkich dzieci w drzewie, a ja jestem slepy i jej nie widze ? Edytowane 23 Sierpnia 2005 przez ajgon Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
FooKy Opublikowano 23 Sierpnia 2005 Zgłoś Opublikowano 23 Sierpnia 2005 (edytowane) Witam Ta odp jest tak na szybko. Poźniej może napisze dokladniejszą Do policzenia: proponuje użyć postorderEnumeration() . (niezbyt efektywne) poczytaj dokladnie: http://java.sun.com/j2se/1.4.2/docs/api/ja...leTreeNode.html Edytowane 23 Sierpnia 2005 przez FooKy Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
ajgon Opublikowano 23 Sierpnia 2005 Zgłoś Opublikowano 23 Sierpnia 2005 Czytalem juz tego manuala setki razy i dalej nie mam koncepcji :mur: Ten typ Enumeration jest jakis dziwny :blink: , moze jakis przyklad ? Bede zobowiazany. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
FooKy Opublikowano 23 Sierpnia 2005 Zgłoś Opublikowano 23 Sierpnia 2005 (edytowane) To dotyczy liczenia jeden chyba z najprostszych ale niezbyt efektywny:) import com.sun.rsasign.i;import java.util.Enumeration;import java.util.Vector;/* * CountEnumer.java * * Created on 23 sierpień 2005, 23:57 * * To change this template, choose Tools | Options and locate the template under * the Source Creation and Management node. Right-click the template and choose * Open. You can then make changes to the template in the Source Editor. *//** * * @author Fooky */public class CountEnumer { /** Creates a new instance of CountEnumer */ public CountEnumer() { Vector v = new Vector(); v.add("2"); v.add("1"); v.add("3"); Enumeration e = v.elements(); int i=0; while(e.hasMoreElements()){ e.nextElement(); i++; } System.out.println("Moje enumeration ma "+i+" elementy."); } public static void main(String[] args) { new CountEnumer(); } } Best Regards Michał J. / FooKy Edytowane 23 Sierpnia 2005 przez FooKy Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
FooKy Opublikowano 23 Sierpnia 2005 Zgłoś Opublikowano 23 Sierpnia 2005 Co do add to w specyfikacji jest podane : add(MutableTreeNode newChild) Removes newChild from its parent and makes it a child of this node by adding it to the end of this node's child array. to pierwsze wyrazy wyraznie mówią że obiekt jest przenoszony z jednego drzewka do drugiego ;) więc nei ma się co dziwić ze jest potem puste:) Best Regards Michał J./ FooKy Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
ajgon Opublikowano 23 Sierpnia 2005 Zgłoś Opublikowano 23 Sierpnia 2005 (edytowane) Tak to jest jak sie czyta po lebkach, dzieki wielkie za pomoc, juz sprawdzam :) edit: Juz sobie poradzilem, proste rozwiazania sa faktycznie najlepsze. A rozwiazania genialne w swojej prostocie, to juz w ogole wymiataja :mrgreen: . FooKy, wielkie dzieki za pomoc :) Edytowane 24 Sierpnia 2005 przez ajgon Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...