Skocz do zawartości
ajgon

Defaultmutabletreenode

Rekomendowane odpowiedzi

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 przez ajgon

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 przez FooKy

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 przez FooKy

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 przez ajgon

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...