powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему у меня выводит ошибку
25 сообщений из 156, страница 3 из 7
Почему у меня выводит ошибку
    #39692952
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevP.S. когда я учился программированию (1991-92), мне говорили, что в нормальной программе 2/3 должны занимать комментарии и 1/3 собственно код.комментировать это хорошо, но надо не просто набирать эти 2/3 ...
я в своё время рефакторил код на аксе,там комментов было строк 10 не несколько тысяч строк кода.
мне бы хватило и этих 10, если б они были в нужном месте и имели нормальное содержание.
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39692962
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

валентин сделал код без parent, я его добавил почему он не запускается?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
public class TreePrint {

    public static void main(String[] args) {

        Tree<String> rootFolder = new Tree<>("RootFolder");

         
        
        Node<String> rootNode = rootFolder.getRoot();
        
        Node<String> video = new Node<>("Video");
        Node<String> music = new Node<>("Music");
        Node<String> picture = new Node<>("Picture");
        
        rootNode.addChild(video);
        rootNode.addChild(music);
        rootNode.addChild(picture);

        video.addChild(new Node<>("Terminator"));
        video.addChild(new Node<>("Die Hard"));
        video.addChild(new Node<>("Rocky"));
        music.addChild(new Node<>("Eminem"));
        picture.addChild(new Node<>("Picasso"));
        
        
        
        Tree<String> rootFolder = new Tree<>("RootFolder1");
        
        
        printCatalog(rootFolder);

    }

    private static <T> void printCatalog(Tree<T> rootFolder) {
        printNode(rootFolder.getRoot());
        List<Node<T>> kids = rootFolder.iterate();
        printTree(kids);
    }

    private static <T> void printTree(List<Node<T>> kids) {
        if (kids.isEmpty()) {
            return;
        }
        for (Node<T> kid : kids) {
            printNode(kid);
            printTree(kid.getChildren());
        }
    }

    private static <T> void printNode(Node<T> kid) {
        System.out.println(kid.getData());

    }
}

--------------------------------
class Tree<T> {

    private final Node<T> root;

    public Tree(T data) {
        root = new Node<>(data);
    }

    public Node getRoot() {
        return root;
    }

    public List<Node<T>> iterate() {
        return root.getChildren();
 

------------------------------
import java.util.ArrayList;

import java.util.List;


import java.util.ArrayList;
import java.util.List;


public class Node<T> {

    private T data;
    private final List<Node<T>> children = new ArrayList<>();
    private final Node<T> parent;

    public Node(T data, Node<T> parent) {
        this.data = data;
        this.parent = parent;
    }

    public void addChild(Node<T> node) {
        children.add(node);
    }

    public List<Node<T>> iterate() {
        return children;
    }

    public void remove(Node<T> node) {
        children.remove(node);
    }

    public List<Node<T>> getChildren() {
        return children;
    }

    public Node getParent() {
        return parent;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39692964
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,

точнее добавила) из за того что вокруг одни мальчики уже общаюсь как мальчик((
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39692980
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяLeonid KudryavtsevP.S. когда я учился программированию (1991-92), мне говорили, что в нормальной программе 2/3 должны занимать комментарии и 1/3 собственно код.комментировать это хорошо, но надо не просто набирать эти 2/3 ...
я в своё время рефакторил код на аксе,там комментов было строк 10 не несколько тысяч строк кода.
мне бы хватило и этих 10, если б они были в нужном месте и имели нормальное содержание.
Просто, перед тем как кодировать, хорошо бы понять, что же ты хочешь закодировать

Сейчас, я в принципе, это себе и так представляю.... Для новичка, хорошо бы сначала описать русским языком, что и зачем он хочет сделать, а уже потом начинать кодировать.

Пример:
Метод addChild должен что-то возвращать... что, зачем?
nastyaa, почему-то, возвращает null.... почему?
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39692981
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

просто мне сказали сделать обычное дерево. Я ему показал 3-4 вида кода он сказал не подходит. В общем нужно сделать addchild с data как в моем коде и запустить его. Просто мой последний отправленный код не могу запустить, как можно его запустить
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39692983
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

код который отправил Валентин(спасибо что написал) там addchild был без data. Плюс там не было parent. А мне нужно чтобы addchild был с data и был parent. Я вроде написала все правильно, только addchild с data кажется не правильно написаны, и не могу его запустить
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39692986
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nastyaa
Код: java
1.
        Node<String> video = new Node<>("Video");



А уж конечно извеняюсь, но у меня, разумеется, он тоже не запускается.
Только ошибка компилятора:

The constructor Node<String>(String) is undefined

назвать НЕ запускается очень сложно. Он даже НЕ КОМПИЛИРУЕТСЯ.

аналогично:

Код: java
1.
        root = new Node<>(data);



Cannot infer type arguments for Node<>
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39692987
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

как можно исправить ошибку можете помочь я уже неделю не могу решить проблему(((
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39692988
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

Остановилась на одном месте(
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39692993
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

пожалуйста помогите( голова кругом неделю парюсь
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39692999
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да простит меня Валентин за издевательство над его классами. Оригинальные не смотрел, использовал классы из последнего поста девушки.

Исходный код

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
import java.util.ArrayList;
import java.util.List;

public class Node<T> {
    private T data;
    private final List<Node<T>> children = new ArrayList<>();
    private final Node<T> parent;

    /**
     * 
     * Создает новый узел
     * 
     * @param data Данные для нового узла
     * @param parent Ссылка на родителя данного узла
     * 
    */
    public Node(T data, Node<T> parent) {
        this.data = data;
        this.parent = parent;
    }

    public void addChild(Node<T> node) {
        children.add(node);
    }

    /**
     * Создает узел и добавляет его в иерархию на основе его данных.
     * 
     * @param nodeData Данные для нового узла
     * @return Возвращает вновь созданный узел
     */
    public Node<T> addChild(T nodeData) {
    	// Создаваемый узел будет принадлежать нашему. Т.ч. его
    	// parent - это мы
    	Node<T> newNode = new Node<T>( nodeData, this ); 
        children.add( newNode );
        return newNode;
    }

    /**
     * Специальный метод, что бы всех разбирающихся в структурах
     * данных доводить до иступления.
     * Все знаю, что метод iterate должен возвращать интератор, а
     * не коллекцию. Если итератора нет, то и нафиг такой метод.
     * 
     * НО ! Если его не будет, тогда у всех будет душевное спокойствие,
     * что не интересно. Поэтому данный метод необходим, как увеличивающий
     * продажи психотропных и успокоительных лекарств, соответственно
     * стимулирующий рост экономики в сфере фарм-индустрии и соответственно
     * увеличивающий рост ВВП России. Слава Путину !!!
    */
    public List<Node<T>> iterate() {
        return children;
    }

    public void remove(Node<T> node) {
        children.remove(node);
    }

    public List<Node<T>> getChildren() {
        return children;
    }

    public Node getParent() {
        return parent;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
import java.util.List;

/**
 * Класс дерево.
 * 
 * Является вырожденным случаем класса Node без указания parent'а. 
 * 
 * @author 
 *
 * @param <T>
 */
public class Tree<T> extends Node<T> {
    public Tree(T data) {
    	/* У корневого узла parent'а нет и быть не может */
    	super( data, null );
    }
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
package test_jvm;

import java.util.List;

public class TreePrint {
    public static void main(String[] args) {

        Tree<String> rootFolder = new Tree<>("RootFolder");

        // Даром не нужно Node<String> rootNode = rootFolder.getRoot();
        
        Node<String> video = rootFolder.addChild( "Video" );
        Node<String> music = rootFolder.addChild( "Music" );
        Node<String> picture = rootFolder.addChild( "Picture" );

        video.addChild( "Terminator" );
        video.addChild( "Die Hard" );
        video.addChild( "Rocky" );
        music.addChild( "Eminem" );
        picture.addChild( "Picasso" );

        printCatalog(rootFolder);

    }

    private static <T> void printCatalog(Tree<T> rootFolder) {
        printNode( rootFolder, 0 );
        List<Node<T>> kids = rootFolder.getChildren();
        printTree(kids, 1 );
    }

    private static <T> void printTree(List<Node<T>> kids, int level ) {
        if (kids.isEmpty()) {
            return;
        }
        for (Node<T> kid : kids) {
            printNode(kid, level );
            printTree(kid.getChildren(), level+1 );
        }
    }

    /**
     * Печатает узел с отступом.
     * 
     * @param kid Узел, который нужно напечатать
     * @param level Положение в иерархии, для генерации красивого отступа
     */
    private static <T> void printNode(Node<T> kid, int level ) {
    	// Печатаем отступ (без перевода строки)
    	for ( int i=0; i<level; i++ ) {
    		System.out.print( "  " );
    	}
        // Печатаем данные и переводим строку
        System.out.println(kid.getData());
    }
}




Результат работы

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
RootFolder
  Video
    Terminator
    Die Hard
    Rocky
  Music
    Eminem
  Picture
    Picasso
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693003
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

Спасибо вам за код я очень вам благодарна) но как сделать так чтобы tree не наследовался от node. Помню у меня был код там сказали, чтобы tree не наследовался от node.
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693019
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы не хотете просто класс PrintTree переназвать в Tree ?
(при копи-пасте на форум отступы уехали ((( )

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
import java.util.ArrayList;
import java.util.List;

public class Node<T> {
    private T data;
    private final List<Node<T>> children = new ArrayList<>();
    private final Node<T> parent;

    /**
     * 
     * Создает новый узел
     * 
     * @param data Данные для нового узла
     * @param parent Ссылка на родителя данного узла
     * 
    */
    public Node(T data, Node<T> parent) {
        this.data = data;
        this.parent = parent;
    }

    public void addChild(Node<T> node) {
        children.add(node);
    }

    /**
     * Создает узел и добавляет его в иерархию на основе его данных.
     * 
     * @param nodeData Данные для нового узла
     * @return Возвращает вновь созданный узел
     */
    public Node<T> addChild(T nodeData) {
    	// Создаваемый узел будет принадлежать нашему. Т.ч. его
    	// parent - это мы
    	Node<T> newNode = new Node<T>( nodeData, this ); 
        children.add( newNode );
        return newNode;
    }

    /**
     * Специальный метод, что бы всех разбирающихся в структурах
     * данных доводить до иступления.
     * Все знаю, что метод iterate должен возвращать интератор, а
     * не коллекцию. Если итератора нет, то и нафиг такой метод.
     * 
     * НО ! Если его не будет, тогда у всех будет душевное спокойствие,
     * что не интересно. Поэтому данный метод необходим, как увеличивающий
     * продажи психотропных и успокоительных лекарств, соответственно
     * стимулирующий рост экономики в сфере фарм-индустрии и соответственно
     * увеличивающий рост ВВП России. Слава Путину !!!
    */
    public List<Node<T>> iterate() {
        return children;
    }

    public void remove(Node<T> node) {
        children.remove(node);
    }

    public List<Node<T>> getChildren() {
        return children;
    }

    public Node getParent() {
        return parent;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
import java.io.PrintStream;
import java.util.List;

/**
 * Дерево с возможность его печати
 */
public class Tree<T> {
	private Node<T> rootNode;
	
	public Tree( T data ) {
		/* Корневой узел владельца не имеет */
		rootNode = new Node<T>( data, null );
	}

	/**
	 * Возврашает корневой узел
	 * 
	 * @return Ссылка на корневой узел
	 */
	public Node<T> getRoot() {
		return rootNode;
	}
	
	/**
	 * Печатает дерево
	 * 
	 * @param writer Куда печатать
	 */
	public void printCatalog( PrintStream out ) {
		// Печатаем сами себя (мы главные, т.ч. без отступов)
        printNode( out, rootNode, 0 );
        // Печатаем узлы в дереве (отступы наинаются с 1 уровня)
        List<Node<T>> kids = rootNode.getChildren();
        printChildren( out, kids, 1 );
	}
	
	/**
	 * Печатает дерево на экран
	 */
	public void printCatalog( ) {
		printCatalog( System.out );
	}
	

	/**
	 * Печатает детей указанной Node (бывший printTree)
	 * 
	 * @param kids Дети для печати
	 * @param level Положение в иерархии, для генерации красивого отступа 
	 */
    private static <T> void printChildren( PrintStream out, List<Node<T>> kids, int level ) {
    	// Проверка на пустоту не нужна. Если пусто, то
    	// и for ничего делать не будет
        // if (kids.isEmpty()) {
        //     return;
        // }
    	
        // Цикл по всем узлам в переданном нам списке для печати
    	for (Node<T> kid : kids) {
            // Печатаем текущей узел
            printNode( out, kid, level );
            // Печатаем всех детей данного узла, увеличиваем уровень
            // в иерархии, что бы увеличился отступ при печати
            printChildren( out, kid.getChildren(), level+1 );
        }
    }

    /**
     * Печатает узел с отступом.
     * 
     * @param kid Узел, который нужно напечатать
     * @param level Положение в иерархии, для генерации красивого отступа
     */
    private static <T> void printNode(PrintStream out, Node<T> kid, int level ) {
    	// Печатаем отступ (без перевода строки)
    	for ( int i=0; i<level; i++ ) {
    		out.print( "  " );
    	}
        // Печатаем данные и переводим строку
        out.println(kid.getData());
    }
}



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
/**
 * Главный класс приложения. Создает дерево и печатает его.
 */
public class TreePrint {
    public static void main(String[] args) {
        Tree<String> rootFolder = new Tree<>("RootFolder");

        Node<String> rootNode = rootFolder.getRoot();
        
        Node<String> video = rootNode.addChild( "Video" );
        Node<String> music = rootNode.addChild( "Music" );
        Node<String> picture = rootNode.addChild( "Picture" );

        video.addChild( "Terminator" );
        video.addChild( "Die Hard" );
        video.addChild( "Rocky" );
        music.addChild( "Eminem" );
        picture.addChild( "Picasso" );

        rootFolder.printCatalog();
    }
}


...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693033
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант более красивых отступов (при моноширинном шрифте)


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
import java.io.PrintStream;
import java.util.List;

/**
 * Дерево с возможность его печати
 */
public class Tree<T> {
	private Node<T> rootNode;
	
	public Tree( T data ) {
		/* Корневой узел владельца не имеет */
		rootNode = new Node<T>( data, null );
	}

	/**
	 * Возврашает корневой узел
	 * 
	 * @return Ссылка на корневой узел
	 */
	public Node<T> getRoot() {
		return rootNode;
	}
	
	/**
	 * Печатает дерево
	 * 
	 * @param writer Куда печатать
	 */
	public void printCatalog( PrintStream out ) {
		// Печатаем сами себя (мы главные, т.ч. без отступов)
        printNode( out, rootNode, 0, null );
        // Печатаем узлы в дереве (отступы наинаются с 1 уровня)
        List<Node<T>> kids = rootNode.getChildren();
        printChildren( out, kids, 1, null );
	}
	
	/**
	 * Печатает дерево на экран
	 */
	public void printCatalog( ) {
		printCatalog( System.out );
	}
	

	/**
	 * Печатает детей указанной Node (бывший printTree)
	 * 
	 * @param kids Дети для печати
	 * @param level Положение в иерархии, для генерации красивого отступа 
	 * @param isLastArr Массив, который для каждого уровня в иерархии, покащывает, печатаем
	 * ли мы последний элемент или не последний (для последнего элемента в каждом уровне не
	 * нужно печатать вертикальную черточку). Размер массива level-1 
	 */
    private static <T> void printChildren( PrintStream out, List<Node<T>> kids, int level, boolean isLastArr[] ) {
    	// Проверка на пустоту не нужна. Если пусто, то
    	// и for ничего делать не будет
        // if (kids.isEmpty()) {
        //     return;
        // }
    	// 
    	boolean curIsLastArr[];
    	curIsLastArr = new boolean[level];
    	// копируем переданные данные из isLastArr в curIsLastArr
    	// последний (текущей) будет не проинициализирован. Мы его будем
    	// заполнять, когда будем ходить по переданной коллекции
    	for ( int i=0; i<(level-1); i++ ) {
    		curIsLastArr[ i ] = isLastArr[ i ];
    	}
        // Цикл по всем узлам в переданном нам списке для печати
    	// Т.к. нам нужно знать, есть ли данные дальше, то используем 
    	// Iterator как более удобный
    	java.util.ListIterator<Node<T>> iterator;
    	iterator = kids.listIterator();
    	while ( iterator.hasNext() ) {
    		// Получаем следующий (текущей) узел
    		Node<T> kid = iterator.next();
    		// Если если есть еще данные, мы НЕ последние на данном
    		// уровне иерархии
    		// Node: т.к. индекс в массиве с 0, то последний элемент
    		// это level-1 
    		if ( iterator.hasNext() ) {
    			// НЕ последний
    			curIsLastArr[ level-1 ] = false; 
    		} else {
    			// последний 
    			curIsLastArr[ level-1 ] = true; 
    		}
        	// Печатаем текущей узел
            printNode( out, kid, level, curIsLastArr );
            // Печатаем всех детей данного узла, увеличиваем уровень
            // в иерархии, что бы увеличился отступ при печати
            printChildren( out, kid.getChildren(), level+1, curIsLastArr );
        }
    }

    /**
     * Печатает узел с отступом.
     * 
     * @param kid Узел, который нужно напечатать
     * @param level Положение в иерархии, для генерации красивого отступа
     * @param isLastArr Массив флагов, что на данном уровне иерархии печататется
     * последний элемент
     */
    private static <T> void printNode(PrintStream out, Node<T> kid, int level, boolean isLastArr[] ) {
    	// Печатаем отступы других уровней. Если на данном уровне мы последнии, то
    	// вертикальную черточку печатать не нужно
    	for ( int i=0; i<(level-1); i++ ) {
    		if ( isLastArr[i] ) {
        		out.print( "    " );  // 4 пробела
    		} else {
    		    out.print( "|   " );  // 3 пробела
    		}
    	}
        // Печатаем отступы для нашего уровня или для корня
		if ( level>0 ) {
			out.print( "+-- " );
		} else {
			// level = 0, корень, отступы не нужны
			;
		}
    	
        out.println(kid.getData());
    }
}



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
/**
 * Главный класс приложения. Создает дерево и печатает его.
 */
public class TreePrint {
    public static void main(String[] args) {
        Tree<String> rootFolder = new Tree<>("RootFolder");

        Node<String> rootNode = rootFolder.getRoot();
        
        Node<String> video = rootNode.addChild( "Video" );
        Node<String> music = rootNode.addChild( "Music" );
        Node<String> picture = rootNode.addChild( "Picture" );
		
        Node<String> terminator = video.addChild( "Terminator" );
        terminator.addChild( "Terminator 1");
        terminator.addChild( "Terminator 2");
        Node<String> T800 = terminator.addChild( "model T-800");
        T800.addChild( "T-800 CPU");
        T800.addChild( "T-800 memory module ");
        T800.addChild( "T-800 I/O perepherals");
        video.addChild( "Die Hard" );
        Node rocky = video.addChild( "Rocky" );
        Node tmp;
        tmp = rocky.addChild( "actors");
        tmp.addChild( "Sylvester Stallone" );
        tmp = rocky.addChild( "music");
        tmp.addChild( "Bill Conti, composer");
        music.addChild( "Eminem" );
        picture.addChild( "Picasso" );

        rootFolder.printCatalog();
    }
}




Вывод


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
RootFolder
+-- Video
|   +-- Terminator
|   |   +-- Terminator 1
|   |   +-- Terminator 2
|   |   +-- model T-800
|   |       +-- T-800 CPU
|   |       +-- T-800 memory module 
|   |       +-- T-800 I/O perepherals
|   +-- Die Hard
|   +-- Rocky
|       +-- actors
|       |   +-- Sylvester Stallone
|       +-- music
|           +-- Bill Conti, composer
+-- Music
|   +-- Eminem
+-- Picture
    +-- Picasso
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693046
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nastyaaЯ ему показал
запалился, однако
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693082
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevВариант более красивых отступов (при моноширинном шрифте)
Вывод


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
RootFolder
+-- Video
|   +-- Terminator
|   |   +-- Terminator 1
|   |   +-- Terminator 2
|   |   +-- model T-800
|   |       +-- T-800 CPU
|   |       +-- T-800 memory module 
|   |       +-- T-800 I/O perepherals
|   +-- Die Hard
|   +-- Rocky
|       +-- actors
|       |   +-- Sylvester Stallone
|       +-- music
|           +-- Bill Conti, composer
+-- Music
|   +-- Eminem
+-- Picture
    +-- Picasso


Leonid Kudryavtsev,

очень козырно напечатали.
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693088
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergunka....
очень козырно напечатали.
тут IMHO интереснее задача, козырно де-печатать. Т.е. сделать нормальный Input пользуясь отступами ))). Т.к. создавать нормальное/сложное дерево пользуясь addChild - убиться ап стену.

Задача для nastyaa )))
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693110
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevтут IMHO интереснее задача, козырно де-печатать. Т.е. сделать нормальный Input пользуясь отступами ))). Т.к. создавать нормальное/сложное дерево пользуясь addChild - убиться ап стену.


Классы Tree и Node без изменений из пред. сообщения

С табуляцией беда какая-то. В Eclipse отступы нормальные, а после копи-паст на форум, съезжают (((
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.StringReader;
import java.util.List;

/**
 * Специальный класс для иерархий из строк. Дополнительно позволяет считывать иерархию
 * из входного потока и разбирать отступы
 * 
 * Универсальный generic'ом сделать не получилось, т.к. требуется явная совметимость типа T со String
 *
 */
public class Tree4String extends Tree<String> {
	/**
	 * Константа, задает сколько пробелов должен быть отступ для одного
	 * уровня.
	 */
	public final static int spaceForOneLevel = 4;
	
	public Tree4String() {
    	     super( "Default root" );
         }

	/**
	 * Возврашает последнию ноду на заданном уровне
	 * 
	 * @param level Уровень. Нумерация с 1
	 * @return Последнию ноду на заданном уровне (и последнию по всем
	 * предыдущим уровням)
	 */
	private Node<String> getNodeByLevel( int level ) {
		Node<String> cur;
		cur = this.getRoot();
		
		// Цикл пока не доберемся до заданного уровня
		// или не кончатся данные (ошибкой не считается)
		for ( int i=1; i<level; i++ ) {
			List<Node<String>> kinds;
			kinds = cur.getChildren();
			// Пееходим на следующий уровень и ищем
			// последний элемент. Для классических
			// списков это операция крайне не оптимальна. 
			int size = kinds.size();
			if ( size==0 ) {
				// Пустой список, ничего не делаем
				;
			} else {
				// Берем последний элемент с данного уровня
				cur = kinds.get( size-1 );
			}
		}
		return cur;
	}
	
	/**
	 * Добювляет узел на заданный уровень дерева в конец списка. Если нужно, можно перенести в generic
	 * 
	 * @param level Уровень. Нумерация с 1. 0 само дерево, тогда его переименовываем
	 * @return Добавленный узел или измененный корень
	 * 
	*/
	public Node<String> addChildAtLevel( int level, String nodeData ) {
		Node<String> nodeToInsert;
		if ( level<=0 ) {
			this.getRoot().setData( nodeData );
			return this.getRoot();
		}
		nodeToInsert = this.getNodeByLevel( level );
		return nodeToInsert.addChild( nodeData );
	}
	
	/**
	 * Функция делит кол-во пробелов/символов в отступе на константу и
	 * возврашает получившийся номер уровня. Выделено в отдельную ф-цию,
	 * что бы проще управлять правилами округления 
	 */
	private int spaceToLevel( int spaceCount, int spaceForOneLevel ) {
		return (spaceCount + (spaceForOneLevel/2)) / spaceForOneLevel;
	}
	
	/**
	 * Подсчитывает кол-во пробелов/символов в отступе в конкретной строке.
	 * 
	 *  Примечание: спец. символы в начале строки так-же считаем пробелами.
	 *  
	 *  @return Позицию первого не пробельного (не отступного) символа.
	 */
	private int calculateSpaceAtString( String s ) {
		int i;
		for ( i = 0; i<s.length(); i++ ) {
			int c = s.charAt( i );
			if ( c==' ' || c=='+' || c=='-' || c=='|' ) {
				continue;
			} else {
				break;
			}
		}
		return i;
	}
	
	/**
	 * Разбирает строку с отступами и добавляет ее в дерево.
	*/
	public Node<String> addStringWithIndent( String s ) {
		int spaceCount = calculateSpaceAtString( s );
		String nodeData = s.substring( spaceCount );
		int level = this.spaceToLevel( spaceCount-1, spaceForOneLevel );
		// Trace
		// System.out.println( "s="+s+"  spaceCount="+spaceCount+" level="+level );
		return this.addChildAtLevel( level, nodeData );
	}

	/**
	 * Создает иерархию читая его из файла с отступами
	 * 
	 * @param reader Откуда читать
	 * @throws IOException
	 */
	public void read( java.io.Reader reader ) throws IOException {
		java.io.LineNumberReader lnr = new LineNumberReader( reader);
		while ( true ) {
			String s = lnr.readLine();
			if ( s==null ) {
				// End of file
				return;
			}
			this.addStringWithIndent( s );
		}
	}
	
	/**
	 * Создает иерархию читая ее из строкового буфера. Текст должен быть разделен на
	 * строки через \n или \r\n
	 * 
	 * @param text Строка содержащая текст
	 * @throws IOException 
	 */
	public void readText( String text ) throws IOException {
		// Читаем из входного потока
		java.io.StringReader reader = new StringReader( text );
        this.read( reader );
        reader.close();
	}
}



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
package test_jvm;

import java.io.IOException;
import java.io.StringReader;

/**
 * Главный класс приложения. Создает дерево и печатает его.
 */
public class TreePrint2 {
	public static void test1() {
            Tree4String rootFolder = new Tree4String();

            rootFolder.addChildAtLevel( 0, "root" );
            rootFolder.addChildAtLevel( 1, "Video" );
            rootFolder.addChildAtLevel( 2, "Terminator" );
            rootFolder.addChildAtLevel( 2, "Die Hard" );
            rootFolder.addChildAtLevel( 2, "Rocky" );
            rootFolder.addChildAtLevel( 1, "Music" );
            rootFolder.addChildAtLevel( 2, "Eminem" );
            rootFolder.addChildAtLevel( 1, "Picture" );
            rootFolder.addChildAtLevel( 2, "Picasso" );

            rootFolder.printCatalog();
	}
	
	public static void test2() {
            Tree4String rootFolder = new Tree4String();

            rootFolder.addStringWithIndent( "root" );
            rootFolder.addStringWithIndent( "    Video" );
            rootFolder.addStringWithIndent( "        Terminator" );
            rootFolder.addStringWithIndent( "        Die Hard" );
            rootFolder.addStringWithIndent( "        Rocky" );
            rootFolder.addStringWithIndent( "    Music" );
            rootFolder.addStringWithIndent( "        Eminem" );
            rootFolder.addStringWithIndent( "    Picture" );
            rootFolder.addStringWithIndent( "        Picasso" );

            rootFolder.printCatalog();
	}

	public static void test3() throws IOException {
        String s =
"root\n" +
"    Video\n"+
"        Terminator\n"+
"        Die Hard\n"+
"        Rocky\n"+
"    Music\n"+
"        Eminem\n"+
"    Picture\n"+
"        Picasso";

            Tree4String rootFolder = new Tree4String();
            rootFolder.readText( s );
            rootFolder.printCatalog();
	}
	
	public static void test4() throws IOException {
		String s =
"RootFolder\r\n" + 
"+-- Video\r\n" + 
"|   +-- Terminator\r\n" + 
"|   |   +-- Terminator 1\r\n" + 
"|   |   +-- Terminator 2\r\n" + 
"|   |   +-- model T-800\r\n" + 
"|   |       +-- T-800 CPU\r\n" + 
"|   |       +-- T-800 memory module \r\n" + 
"|   |       +-- T-800 I/O perepherals\r\n" + 
"|   +-- Die Hard\r\n" + 
"|   +-- Rocky\r\n" + 
"|       +-- actors\r\n" + 
"|       |   +-- Sylvester Stallone\r\n" + 
"|       +-- music\r\n" + 
"|           +-- Bill Conti, composer\r\n" + 
"+-- Music\r\n" + 
"|   +-- Eminem\r\n" + 
"+-- Picture\r\n" + 
"    +-- Picasso";

              Tree4String rootFolder = new Tree4String();
              rootFolder.readText( s );
              rootFolder.printCatalog();
        }

        public static void main(String[] args) throws IOException {
		System.out.println( "\n\n************ TEST 1 ************\n\n" );
    	        test1();

		System.out.println( "\n\n************ TEST 2 ************\n\n" );
    	        test2();
		
                System.out.println( "\n\n************ TEST 3 ************\n\n" );
    	        test3();
		
                System.out.println( "\n\n************ TEST 4 ************\n\n" );
    	         test4();
       }
}





Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
************ TEST 1 ************


root
+-- Video
|   +-- Terminator
|   +-- Die Hard
|   +-- Rocky
+-- Music
|   +-- Eminem
+-- Picture
    +-- Picasso


************ TEST 2 ************


root
+-- Video
|   +-- Terminator
|   +-- Die Hard
|   +-- Rocky
+-- Music
|   +-- Eminem
+-- Picture
    +-- Picasso


************ TEST 3 ************


root
+-- Video
|   +-- Terminator
|   +-- Die Hard
|   +-- Rocky
+-- Music
|   +-- Eminem
+-- Picture
    +-- Picasso


************ TEST 4 ************


RootFolder
+-- Video
|   +-- Terminator
|   |   +-- Terminator 1
|   |   +-- Terminator 2
|   |   +-- model T-800
|   |       +-- T-800 CPU
|   |       +-- T-800 memory module 
|   |       +-- T-800 I/O perepherals
|   +-- Die Hard
|   +-- Rocky
|       +-- actors
|       |   +-- Sylvester Stallone
|       +-- music
|           +-- Bill Conti, composer
+-- Music
|   +-- Eminem
+-- Picture
    +-- Picasso
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693113
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S.
вместо
Код: java
1.
		int level = this.spaceToLevel( spaceCount-1, spaceForOneLevel );


должно быть просто (-1 тут лишний)
Код: java
1.
		int level = this.spaceToLevel( spaceCount, spaceForOneLevel );


хотя, на результате это не сказывается )))
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693187
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin KolesnikovnastyaaValentin Kolesnikov,

Вообще никак? с data?

Это нарушает The Single Responsibility Principle

https://ru.m.wikipedia.org/wiki/SOLID_(объектно-ориентированное_программирование)

С уважением, Валентин

YouTube Video
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693198
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

Спасибо вам))) большое ценю вашу помощь))
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693200
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,
Кстати как можно объединить эти две рекурсии printCatalog и printTree в одну новую что в самом низу кода которую назвал printTree
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
    
    private static <T> void printCatalog(Tree<T> rootFolder) {
        printNode( rootFolder, 0 );
        List<Node<T>> kids = rootFolder.getChildren();
        printTree(kids, 1 );
    }

    private static <T> void printTree(List<Node<T>> kids, int level ) {
        if (kids.isEmpty()) {
            return;
        }
        for (Node<T> kid : kids) {
            printNode(kid, level );
            printTree(kid.getChildren(), level+1 );
        }
    }

private static <T> void printTree(Node<T> node) {
       ???????????????????????????????????????????
       ????????????????????????????????????????
        
    }
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693207
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nastyaaLeonid Kudryavtsev,
Кстати как можно объединить эти две рекурсии printCatalog и printTree в одну новую что в самом низу кода которую назвал printTree
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
    
    private static <T> void printCatalog(Tree<T> rootFolder) {
        printNode( rootFolder, 0 );
        List<Node<T>> kids = rootFolder.getChildren();
        printTree(kids, 1 );
    }

    private static <T> void printTree(List<Node<T>> kids, int level ) {
        if (kids.isEmpty()) {
            return;
        }
        for (Node<T> kid : kids) {
            printNode(kid, level );
            printTree(kid.getChildren(), level+1 );
        }
    }

private static <T> void printTree(Node<T> node) {
       ???????????????????????????????????????????
       ????????????????????????????????????????
        
    }



Добрый день,

Рад что Леонид написал эти замечательные коды.

Надеюсь этот метод тоже получится добавить.

ЗЫ. Вы обещали тестовые файлы для конвертора прислать.

С уважением, Валентин
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693208
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valentin Kolesnikov,

сейчас в вашем форуме скину
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693209
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valentin Kolesnikov,

как эти два года объединить не подскажите в один который я создала новый treePrint
...
Рейтинг: 0 / 0
25 сообщений из 156, страница 3 из 7
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему у меня выводит ошибку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]