powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему у меня выводит ошибку
25 сообщений из 156, страница 4 из 7
Почему у меня выводит ошибку
    #39693213
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valentin Kolesnikov,
Я написала но у меня ничего не выходит почему?
Код: 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.
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import javax.swing.tree.TreeNode;

import java.util.*;

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

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

        
        
        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" );

        

    }

    private static <T> void printTree(Node<T> node, int level) {
        printNode(node, level);
        if (node.getChildren() != null){
            for (Node childNode: node.getChildren()) {
                printTree(childNode, level + 1);
            }
        }
    }

   
    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());
    }
}
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693221
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nastyaa,

Нет вызова для метода printTree внутри main.

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

И вообще я правильно написала код где те старые две рекурсии соединила в один printTree
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693225
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nastyaaValentin Kolesnikov,
как можно исправить ошибку?

Нужно добавить вызов для printTree внутри main.

С уважением, Валентин
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693226
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valentin Kolesnikov,
я написала сама правильно?
Код: 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.
public class Main
{
	public static void main(String[] args) {

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



        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" );

        printTree(rootFolder);
    }

    private static <T> void printTree(Node<T> node) {
        printTree(node, 0);
    }

    private static <T> void printTree(Node<T> node, int level) {
        printNode(node, level);
        if (node.getChildren() != null){
            for (Node childNode: node.getChildren()) {
                printTree(childNode, level + 1);
            }
        }
    }


    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());
    }
    
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693227
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nastyaaValentin Kolesnikov,

И вообще я правильно написала код где те старые две рекурсии соединила в один printTree

Вроде бы правильно написано.

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

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

мне сказали работать с contains
на примере этого
Код: java
1.
2.
list 1
boolean = 1.contains("object)



чтобы допустим я буду искать какой то элемент в дереве и если он будет то нужно чтобы выводило true
как можно реализовать это в коде?


Код: 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.
public class TreePrint {

    public static void main(String[] args) {

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

        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");
        Node<String> picture1 = picture.addChild("Picasso");
        picture1.addChild("P1");
        Node<String> picture2 = picture1.addChild("P2");
        picture2.addChild("P3");
        picture2.addChild("P3");

        printTree(rootFolder);
    }

    private static <T> void printTree(Node<T> node) {
        printTree(node, 0);
    }

    private static <T> void printTree(Node<T> node, int level) {
        printNode(node, level);
        if (node.getChildren() != null) {
            for (Node childNode : node.getChildren()) {
                printTree(childNode, level + 1);
            }
        }
    }

    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());
    }
}

---------------------------------------------------
 import java.util.List;


public class Tree<T> extends Node<T> {

    public Tree(T data) {

        super(data, null);
    }
}
--------------------------------------------
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 Node<T> addChild(T nodeData) {

        Node<T> newNode = new Node<T>( nodeData, this ); 
        children.add( newNode );
        return newNode;
    }


    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
Почему у меня выводит ошибку
    #39693436
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valentin Kolesnikov,

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

мне сказали работать с contains
на примере этого
Код: java
1.
2.
list 1
boolean = 1.contains("object)



чтобы допустим я буду искать какой то элемент в дереве и если он будет то нужно чтобы выводило true
как можно реализовать это в коде?


Код: 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.
public class TreePrint {

    public static void main(String[] args) {

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

        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");
        Node<String> picture1 = picture.addChild("Picasso");
        picture1.addChild("P1");
        Node<String> picture2 = picture1.addChild("P2");
        picture2.addChild("P3");
        picture2.addChild("P3");

        printTree(rootFolder);
    }

    private static <T> void printTree(Node<T> node) {
        printTree(node, 0);
    }

    private static <T> void printTree(Node<T> node, int level) {
        printNode(node, level);
        if (node.getChildren() != null) {
            for (Node childNode : node.getChildren()) {
                printTree(childNode, level + 1);
            }
        }
    }

    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());
    }
}

---------------------------------------------------
 import java.util.List;


public class Tree<T> extends Node<T> {

    public Tree(T data) {

        super(data, null);
    }
}
--------------------------------------------
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 Node<T> addChild(T nodeData) {

        Node<T> newNode = new Node<T>( nodeData, this ); 
        children.add( newNode );
        return newNode;
    }


    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;
    }
}



Настя,

Спросите у инструктора почему вместо лист не использовать LinkedHashMap

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

чтобы допустим я буду искать какой то элемент в дереве и если он будет то нужно чтобы выводило true
как можно реализовать это в коде?

Примерно так же как и печатаете только возвращает тру когда елемент находится т.е. Вам надо еще сделать в Node классе метод equals и hashCode

Хорошая новость для Вас это сгенерит IDE.
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693504
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergunka,
Contains я правильно добавила?
Код: 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.
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 Node<T> addChild(T nodeData) {
    	
    	Node<T> newNode = new Node<T>( nodeData, this ); 
        children.add( newNode );
        return newNode;
    }

   
    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;
    }
    public boolean contains(List<T> list, Object o) {
        if (list.contains(o)) {
            return true;
        } else 
           return false;
        
    }
}
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693570
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nastyaaSergunka,
Contains я правильно добавила?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
    public boolean contains(List<T> list, Object o) {
        if (list.contains(o)) {
            return true;
        } else 
           return false;
        
    }
...


IMHO

1) Масло-масленное. Что делает Ваш метод, совершенно не понятно
2) Тут, могу только предполагать, что Вам нужен был метод ищущий в СВОЕМ списке. Тогда он должен иметь заголовок
Код: sql
1.
2.
3.
    public boolean contains(Node<T> o) {
..... /* Вставить то, что нужно. За 2 недели еб#$%и мозгов Java, уже должны были какие-то инстинкты выработаться */
}


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

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

Мне сказали без LinkedMap. Просто в моем дереве использовать contains. Допустим в моем же дереве есть элемент терминатор, то он должен выводить true, а если нету терминатора то false
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693595
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,
Не подскажите какой метод, чтобы работало в моем дереве
Код: java
1.
2.
3.
4.
 public boolean contains(Node<T> o) {
        return false;

    
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693596
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nastyaaА вообще через него можно искать элементы в моем дереве
Наверное можно. Метод как метод.

Я бы предложил следующую реализацию в классе Node. Немного переутяжелено, т.к.
добавил флаг глобального поиска
Код: 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.
    /**
     * Возвращает hashCode. Требуется для корректной работы стандартных коллекций
     */
    @Override
	public int hashCode() {
		return this.data.hashCode();
	}

    /**
     * Провеяем эквивалентность двух узлов по их содержимому.
     */
	@Override
	public boolean equals(Object obj) {
		return this.data.equals( ((Node<T>)obj).data );
	}

	/**
     *  Ищем, есть ли уже узел с такими данными.
     * 
     * @param obj Данные с которыми сверяемся.
     * @param global Если false, то поиск только в текущем узле, если true,
     * то по всему дереву
     */
    public boolean contains( Node<T> obj, boolean global ) {
    	/* Проверка на текущем уровне */
    	if ( this.children.contains(obj) ) {
    		return true;
    	}
    	/* Если требуется глобальная проверка, рекурсивно проверяем и у детей */
    	if ( global ) {
    		for ( Node<T> kind: this.children ) {
    			if ( kind.contains( obj, global ) ) {
    				return true;
    			}
    		}
    	}
    	return false;
    }

    /**
     * Ищет данные в дереве
     */
    public boolean contains( T obj, boolean global ) {
    	// Временный объект для поиска
    	Node<T> tmp = new Node<T>( obj, null );
    	// Ищем
    	return this.contains( tmp, global );
    }
    
    /**
     * Ищет данные в дереве глобально
    */
    public boolean contains( T obj ) {
    	return this.contains( obj, true );
    }




Проверку на уникальность - не проверял. Может не работать
Отступы уехали, у меня tab по умолчанию 4 символа (((
Код: 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.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
package test_jvm;

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

/**
 * Класс элемента дерева и, собственно, само дерево.
 * 
*/
public class Node<T> {
    private T data;
    private List<Node<T>> children = new ArrayList<>();
    private Node<T> parent;
    /*
     * Константы задающие тип иникальности
     */
    /**
     * Иерархия не контролирует иникальность добавленных записей
     */
    public static final int NO_UNIQUE = 0;
    /**
     * Дубли на одном уровне не допускаются
     */
    public static final int LEVEL_UNIQUE = 1;
    /**
     * Дубли на допускаются целиком по дерево (ниже лежащим уровням)
     */
    public static final int GLOBAL_UNIQUE = 2;
    
    /**
     * 
     */
    public int uniqueMode;
    /**
     * Создает новый КОРНЕВОЙ узел. Проставляет флаг уникальности. 
     * 
     * @param data Данные для нового узла
     * @param parent Ссылка на родителя данного узла
     * @aram uniqueMode режим уникальности
     * 
    */
    public Node(T data, Node<T> parent, int uniqueMode ) {
        this.data = data;
        this.parent = parent;
        this.uniqueMode = uniqueMode;
    }
    
    /**
     * Создает новый узел. Флаг уникальности копируется из предка. Что
     * обеспечивает, что все дерево будет иметь один и тот же режим
     * проверки уникальности 
    */
    public Node( T data, Node<T> parent ) {
    	if ( parent==null ) {
            this.data = data;
            this.parent = parent;
            this.uniqueMode = NO_UNIQUE;
    	} else {
            this.data = data;
            this.parent = parent;
            this.uniqueMode = this.parent.uniqueMode;
    	}
    }

    
    /**
     * Возвращает hashCode. Требуется для корректной работы стандартных коллекций
     */
    @Override
	public int hashCode() {
		return this.data.hashCode();
	}

    /**
     * Провеяем эквивалентность двух узлов по их содержимому.
     */
	@Override
	public boolean equals(Object obj) {
		return this.data.equals( ((Node<T>)obj).data );
	}

	/**
     *  Ищем, есть ли уже узел с такими данными.
     * 
     * @param obj Данные с которыми сверяемся.
     * @param global Если false, то поиск только в текущем узле, если true,
     * то по всему дереву
     */
    public boolean contains( Node<T> obj, boolean global ) {
    	/* Проверка на текущем уровне */
    	if ( this.children.contains(obj) ) {
    		return true;
    	}
    	/* Если требуется глобальная проверка, рекурсивно проверяем и у детей */
    	if ( global ) {
    		for ( Node<T> kind: this.children ) {
    			if ( kind.contains( obj, global ) ) {
    				return true;
    			}
    		}
    	}
    	return false;
    }

    /**
     * Ищет данные в дереве
     */
    public boolean contains( T obj, boolean global ) {
    	// Временный объект для поиска
    	Node<T> tmp = new Node<T>( obj, null );
    	// Ищем
    	return this.contains( tmp, global );
    }
    
    /**
     * Ищет данные в дереве глобально
    */
    public boolean contains( T obj ) {
    	return this.contains( obj, true );
    }
    
    public void addChild(Node<T> node) throws NotUniqueException {
    	/*
    	 *  Если требуется обеспечение уникальности, то проверяем, что
    	 * узла с такими данными еще не существует
    	 */
    	if ( uniqueMode!=Node.NO_UNIQUE ) {
    		if ( this.contains( node, uniqueMode==Node.GLOBAL_UNIQUE )) {
    			throw new NotUniqueException();
    		}
    	}
        children.add(node);
    }

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

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, Node.NO_UNIQUE );
	}

	/**
	 * Создает дерево с заданным типом проверки уникальности
	 * @param data
	 */
	public Tree( T data, int uniqueMode ) {
		/* Корневой узел владельца не имеет, зато может иметь проверку уникальности */
		rootNode = new Node<T>( data, null, uniqueMode );
	}

	/**
	 * Возврашает корневой узел
	 * 
	 * @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.
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.
145.
146.
147.
148.
149.
150.
package test_jvm;

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;
	}
	
	/**
	 * Добювляет узел на заданный уровень дерева в конец списка.
	 * 
	 * @param level Уровень. Нумерация с 1. 0 само дерево, тогда его переименовываем
	 * @return Добавленный узел или измененный корень
	 * @throws NotUniqueException 
	 * 
	*/
	public Node<String> addChildAtLevel( int level, String nodeData ) throws NotUniqueException {
		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;
	}
	
	/**
	 * Разбирает строку с отступами и добавляет ее в дерево.
	 * @throws NotUniqueException 
	*/
	public Node<String> addStringWithIndent( String s ) throws NotUniqueException {
		int spaceCount = calculateSpaceAtString( s );
		String nodeData = s.substring( spaceCount );
		int level = this.spaceToLevel( spaceCount, spaceForOneLevel );
		// Trace
		// System.out.println( "s="+s+"  spaceCount="+spaceCount+" level="+level );
		return this.addChildAtLevel( level, nodeData );
	}

	/**
	 * Создает иерархию читая его из файла с отступами
	 * 
	 * @param reader Откуда читать
	 * @throws IOException
	 * @throws NotUniqueException 
	 */
	public void read( java.io.Reader reader ) throws IOException, NotUniqueException {
		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 
	 * @throws NotUniqueException 
	 */
	public void readText( String text ) throws IOException, NotUniqueException {
		// Читаем из входного потока
		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.
package test_jvm;

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

/**
 * Главный класс приложения. Создает дерево и печатает его.
 * Проверяет работу метода contains и не возможность добавить дубли
 */
public class TreePrint3 {
	public static void test1() throws IOException, NotUniqueException {
        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();
        Node<String> rootNode = rootFolder.getRoot();

   	 	System.out.println( "" );
   	 	
        if ( rootNode.contains( "nastyaa" ) ) {
        	System.out.println( "There is nastyaa in tree" );
        } else {
       	 	System.out.println( "There is NOT nastyaa in tree" );
        }

        if ( rootNode.contains( "Video" ) ) {
       	 	System.out.println( "There is Video in tree" );
        } else {
      	 	System.out.println( "There is NOT Video in tree" );
        }

        if ( rootNode.contains( "Picasso" ) ) {
       	 	System.out.println( "There is Picasso in tree" );
        } else {
      	 	System.out.println( "There is NOT Picasso in tree" );
        }
	}
	

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



вывод:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
************ TEST 1 ************


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

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

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

Спасибо вам) что за комментили коды и все вроде понимаю как работает.
Но мне(((( сказали не изменять код просто добавить contains
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693631
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я специально без спойлера просто привел "метод contains"

Что бы стандартный contains в коллекции работал корректно, требуется реализовать метод equals и hashCode. Т.ч. одного метода contains не достаточно.

"Нормально" contains будет искать экземпляры с тем типом, который лежит в коллекции children, т.е. с типом Node<T> . Это не очень удобно. Поэтому нужна реализация двух версий contains. одна (базовая) которая ищет объекты Node<T> и другая, которая ищет <T> (методом создания на его основе экземпляра Node<T> и дальнейшего поиска вновь созданного экземпляра)

Итого, как минимум нужно: hashCode, equals, contains( Node<T> ), contains( T )

Выкинуть параметр global, если он Вам не нужен, мне кажется Вы должны быть способны. Я в Вас верю )))
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693632
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S.
Русский язык в комментариях лучше поправить. Я кроме Java, C, PL/SQL и немного Assembler'а других языков не знаю. Немного читаю по слогам на русском и техническом английском, но писать на них не умею (((
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693636
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.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 Node<T> addChild(T nodeData) {
    	
    	Node<T> newNode = new Node<T>( nodeData, this ); 
        children.add( newNode );
        return newNode;
    }

   
    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;
    }
    public boolean contains(List<Node<String>> childrens, String text) {
    return recurse(childrens, text);
}
 
private boolean recurse(List<Node<String>> childrens, String text) {
    return childrens.stream()
        .anyMatch(children -> children.data.equals(text) || children.children.size() > 0 && recurse(children.children, text));
}
 
 

    
    }

----------------------------------
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import javax.swing.tree.TreeNode;

import java.util.*;

public class TreePrint {

    public static void main(String[] args) {

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

        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");
        Node<String> picture1 = picture.addChild("Picasso");
        picture1.addChild("P1");
        Node<String> picture2 = picture1.addChild("P2");
        picture2.addChild("P3");
        picture2.addChild("P3");

        printTree(rootFolder);
        System.out.println(rootFolder.contains(rootFolder.getChildren(), "Terminator"));
    }

    private static <T> void printTree(Node<T> node) {
        printTree(node, 0);
    }

    private static <T> void printTree(Node<T> node, int level) {
        printNode(node, level);
        if (node.getChildren() != null) {
            for (Node childNode : node.getChildren()) {
                printTree(childNode, level + 1);
            }
        }
    }

    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());
        
    }
}
        
    



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

Я сделала)
...
Рейтинг: 0 / 0
Почему у меня выводит ошибку
    #39693640
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nastyaaЯ сделала)
Молодец !
...
Рейтинг: 0 / 0
25 сообщений из 156, страница 4 из 7
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему у меня выводит ошибку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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