Как мне создать toString, используя другой «вспомогательный» класс в моем дереве java?

#java #data-structures #tree #linked-list

#java #структуры данных #дерево #связанный список

Вопрос:

Я пытаюсь выяснить, как создать метод toString() из класса parentheticRepresentation, приведенного ниже.

 public static <E> String parentheticRepresentation(Tree<E> T, Position<E> v) {
        String s = v.element().toString();
        if (T.islnternal(v)) {
        Boolean firstTime = true;
        for (Position<E> w : T.children(v))
        if (firstTime) {
        s  = " ( "   parentheticRepresentation(T, w);

        firstTime = false;
        }
        else s  = ", "   parentheticRepresentation(T, w);
        s  = " ) ";
        }
        return s;
        }
 

В моем основном классе, когда я создаю узлы для своего дерева и пытаюсь вывести все дерево, он просто выводит один узел с представлением в скобках. Итак, как мне создать другой класс toString(), используя это, чтобы при вызове для вывода моего дерева он давал мне представление, как в классе выше. Любая помощь будет оценена!

 public static void main(String[] args) {

    LinkedTree<Character> T = new LinkedTree();

    // add root
    T.addRoot('A');

    // add children of root
    T.createNode('B', (TreeNode) (T.root()), new NodePositionList());
    TreePosition C = T.createNode('C', (TreeNode) (T.root()),
            new NodePositionList());
    T.createNode('D', (TreeNode) (T.root()), new NodePositionList());

    // add children of node C

    T.createNode('E', C, new NodePositionList());
    TreePosition F = T.createNode('F', C, new NodePositionList());
    T.createNode('G', C, new NodePositionList());

    // add childrn of Node F
    T.createNode('H', F, new NodePositionList());
    T.createNode('I', F, new NodePositionList());

    // print out tree

    System.out.println("Size = "   T.size());
    System.out.println("Here is the tree:");
    System.out.println(T);

}
 

}

Комментарии:

1. Вы ожидаете чего-то вроде A(B, C (E, F (H, I), G), D)?

2. ДА. я просто не могу понять, что написать в моем методе toString, который возвращает мне этот вывод, используя parentheticRepresentation .

Ответ №1:

Вам нужно будет выполнить предварительный обход, просто открыв скобку при обходе дочерних элементов, а затем закрыв ее после этого.

Что-то вроде этого (не уверен, работает ли это, поскольку я его не тестировал, но просто чтобы дать вам представление).

 public static <E> String parentheticRepresentation(Tree<E> T, Position<E> v) {
    String s = "";
    if (T.islnternal(v)) {
        s = v.element().toString(); //adds node to string      
        if(T.children(v).size() > 0)
        {
            s  = "("; //opens parenthesis for children
            for (Position<E> w : T.children(v))
            {
                s  = parentheticRepresentation(T, w)   ",";
            }
            s = s.deleteCharAt(s.length() - 1); //deletes last comma
            s  = ")"; //closes parenthesis for children
        }
    }
    return s;
}
 

Чтобы переопределить метод toString(), добавьте что-то вроде этого в класс Tree.

 @Override
public String toString(){
     //Just speculating the TreeHelper name, but its calling the helper method.
     return TreeHelper.parentheticRepresentation(this,this.root());
}
 

редактировать: используя ссылку «this», поскольку мы находимся внутри класса Tree.

Комментарии:

1. Хорошо, я это понимаю, но как мне создать метод toString(), который возвращает мне это представление в скобках

2. вам нужно будет переопределить метод toString() в классе Tree и вызвать для него этот метод.

3. @Override public String toString() { Tree<E> T = null; Position<E> v = null; возвращает представление в скобках (T, v); }

4. Я пытался это сделать, но при компиляции он выдает ошибки

5. Я также пытался использовать ваше редактирование, но оно выводит только узел «A», то есть корень.

Ответ №2:

Ну, очевидно, что OP находится в моем классе data structures….

Вот что я сделал (с помощью предоставленного нам метода представления в скобках).

 private static <E> String parentheticRepresentation (Tree <E> T, Position <E> v){

    String s = v.element().toString();

    if (T.isInternal(v)){

        Boolean firstTime = true;


        Iterator <Position<E>> it = T.children(v).iterator();

        while (it.hasNext()){

            Position<E> w = it.next();


            if (firstTime) {

                s = " ( "   parentheticRepresentation (T,w);
                firstTime = false;
            }

            else s = ", "   parentheticRepresentation (T,w);
        s = " )";
    }}

    return s;

            }



public String toString() 
{
return parentheticRepresentation(this,this.root());

}
 

Проблема в том, что я продолжаю получать ошибки переполнения стека для своих дочерних методов (которые добавлены ниже)

РЕДАКТИРОВАТЬ: я исправил ошибки переполнения стека, но знаю, что у меня та же проблема, что и у OP. Выводится только корень (A).

 public Position<E> parent(Position<E> v) throws InvalidPositionException,
        BoundaryViolationException {
    TreePosition<E> p = checkPosition(v);
    Position<E> parentPosition = p.getParent();
    if (parentPosition == null)
        throw new BoundaryViolationException("No parent");
    return parentPosition;
}

public Iterable<Position<E>> children(Position<E> v)
        throws InvalidPositionException {
    TreePosition <E> p = checkPosition(v);

    if (isExternal(v))    //STACK OVERFLOW
        throw new InvalidPositionException("");
return p.getChildren();
}

public boolean isInternal(Position<E> v) throws InvalidPositionException {

    checkPosition(v);
    return (children(v) != null);

}

public boolean isExternal(Position<E> v) throws InvalidPositionException {
    checkPosition(v);  
    return (children(v) == null); // STACK OVERFLOW
}
 

Комментарии:

1. ага, получаю то же самое … «А».