Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 36

Разветвленные деревья

19.07.2015, 22:39. Показов 909. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Есть одна небольшая задача: используя уже созданные классы Tree (модель для JTree) и Node (универсальный класс для узлов дерева) создать иерархию классов для сохранения сыновей в структуре данных - массив, и добавление в начало массива, в конец и по алфавиту.
Класс 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
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
 
public class Tree implements TreeModel{
    private Node root;
    public Tree(Node root) {
        super();
        this.root = root;
    }
    public void add(Node parent, Node son) throws Exception {
        parent.add(son);
    }   
    public void remove(Node node) {
        if(node == root) root = null;
        node.remove();
    }   
    public Node createNode(Node parent, Object data) {
        return parent.createNode(data);
    }   
    public void setData(Node node, Object data) {
        node.setData(data);
    }
    @Override
    public Object getChild(Object object, int index) {
        return ((Node)object).getChild(index);
    }
    @Override
    public int getChildCount(Object object) {
        return ((Node)object).getChildCount();
    }
    @Override
    public int getIndexOfChild(Object parent, Object child) {
        Node p = (Node) parent, ch = (Node) child;
        return p.getIndexOfChild(ch);
    }
    @Override
    public Object getRoot() {
        return root;
    }
    @Override
    public boolean isLeaf(Object object) {
        return ((Node)object).isLeaf();
    }
}
Класс Node:
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
import java.util.Iterator;
public abstract class Node implements Iterable<Node>, Comparable<Node>{
    private Object data;
    private Node parent;
    public abstract Iterator<Node> iterator();
    public void add(Node son) throws Exception {
        for (Node node : this) {
            if (node.getData().equals(son.getData())) {
                throw new Exception(son.toString() + " already exist!");
            }
        } basicAdd(son);
    }
    protected abstract void basicAdd(Node son);
    public void remove() {
        if(parent == null) return;
        for(Iterator<Node> iter = parent.iterator();iter.hasNext();){
            Node node = iter.next();
            if(node == this) iter.remove();
        }
    }
    public abstract Node createNode(Object data);
    protected void setData(Object data) {
        this.data = data;
    }
    protected Node getParent() {
        return parent;
    }
    protected void setParent(Node parent) {
        this.parent = parent;
    }
    protected Object getData() {
        return data;
    }
    @Override
    public String toString() {
        return data.toString();
    }
    public Object getChild(int index) {
        int i = 0;
        for (Node node : this) {
            if (i == index) {
                return node;
            } i++;
        } return null;
    }
    public int getChildCount() {
        int i = 0;
        try {
            for (@SuppressWarnings("unused") Node node : this) i++;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return i;
    }
    public int getIndexOfChild(Node ch) {
        int i = 0;
        for (Node node : this) {
            if (node == ch) {
                return i;
            } i++;
        } return -1;
    }
    public boolean isLeaf() {
        return getChildCount() == 0;
    }
    public int compareTo(Node node) {
        return data.toString().compareTo(node.data.toString());
    }
}
Вот одна из реализаций классов для сохранения сыновей в массивах:
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.Iterator;
public abstract class ArrayNode extends Node {
    protected int currentIndex = 0;
        protected int countElem = 0;
    private int startSize = 2;
    private int prevSize = 1;
    protected int fibo(){
        int fibo = prevSize + startSize;
        prevSize = startSize; startSize = fibo;
        return fibo;
    }
    protected ArrayNode[] arraySon = new ArrayNode[fibo()];
    private class ArrayNodeIterator implements Iterator<Node>{
        int index = 0;
        @Override
        public boolean hasNext() {
            return index < arraySon.length;//false;
        }
        @Override
        public Node next() {
            ++index;
            return arraySon[index];//null;
        }
    }
    public ArrayNodeIterator iterator(){
        return null;
    }
}
public class ArrayNodeLast extends ArrayNode {
    public ArrayNodeLast(Object data) {
        setData(data);
        setParent(this);
    }
    @Override
    protected void basicAdd(Node son) {
        ArrayNodeLast newSon = (ArrayNodeLast) son;
        if(arraySon[0] == null){
            arraySon[0] = newSon;
            return;
        }
        arraySon[currentIndex] = newSon;
        currentIndex++; ++countElem;
    }
    @Override
    public Node createNode(Object data) {
        return new ArrayNodeLast(data);
    }
}
Если кто то может, то помогите разобраться с этим, или дайте советы, как это реализовать классы ArrayNode и ArrayNodeLast
P. S. совсем недавно начал изучать java, так сильно не критикуйте)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.07.2015, 22:39
Ответы с готовыми решениями:

Курсач по теме: Структуры данных. Двоичные деревья поиска. Красно-черные деревья
Здравствуйте, я первокурсник, преподавателя по информатике месяца 2 не было, потом появился, дал курсач, пару занятий провел и всё. Не...

Разветвленные процессы
Добрый день. Нужно составить программу в среде Dev-C++ предназначенную для обработки разветвленных процессов. Пользователь вводит...

Разветвленные алгоритмы и программы
Добрый вечер. У меня проблемка с этой задачей: Автолюбитель выезжает из пункта А в пункт В, расстояние между которыми 300 километров....

14
Кандёхаем веселее!
 Аватар для MLPMan
296 / 330 / 76
Регистрация: 02.10.2012
Сообщений: 2,175
21.07.2015, 11:19
По мне, лучше будет сделать 1 класс с 3-мя (публичными) методами добавления. Или с флагом, какой вид добавления сейчас "включён".
0
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 36
21.07.2015, 16:34  [ТС]
Да, я так и делаю, у меня такое получилось, если брать структуру для хранения данных одну из коллекций или связный список
Проблема именно в данной структуре (массиве). Как его организовать?
+ Нужно создавать свой итератор, с этим тоже проблема...
0
Кандёхаем веселее!
 Аватар для MLPMan
296 / 330 / 76
Регистрация: 02.10.2012
Сообщений: 2,175
21.07.2015, 17:45
Пусть в классе узла будет поле типа массив. И методы по-разному добавляют в него элементы. Итератор - временный объект, связанный с основной структурой данных.
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
public class Node {
 
  Node[] children;
 
  /*
    Не обязательно делать внутренним классом, но иначе придётся самому передавать ссылку на массив в конструкторе.
  */ 
  class MyIter implements Iterator<Node> {
 
    private int index = 0;
 
     public boolean hasNext() {
       return (index < children.length);
     }
 
     public Node next() {
       return children[index++];
     }     
  }
 
  public Iterator iterator() {
    return new MyIter();
  }
 
}
0
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 36
21.07.2015, 17:49  [ТС]
Хорошо, а как тогда добавить в массив элемент? Его нужно добавить в производном классе. А также нужно выделить память для children. Где ее выделять: в данном классе или производном?
0
Кандёхаем веселее!
 Аватар для MLPMan
296 / 330 / 76
Регистрация: 02.10.2012
Сообщений: 2,175
21.07.2015, 18:14
Цитата Сообщение от roma_m Посмотреть сообщение
как тогда добавить в массив элемент
Создать новый массив, на 1 элемент больше, скопировать туда старый массив плюс новый элемент, заменить ссылку старого массива новым. В классе Arrays есть методы, чтобы меньше писанины.

Цитата Сообщение от roma_m Посмотреть сообщение
Где ее выделять: в данном классе или производном?
В производном, иначе не получится, потому что это в нём массив детей, а не в "универсальном".
1
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 36
21.07.2015, 19:15  [ТС]
Вот, создал нечто подобное:

"универсальный"
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
import java.util.Iterator;
 
public abstract class ArrayNode extends Node {
 
    protected ArrayNode[] arraySon;
 
    private class ArrayNodeIterator implements Iterator<Node>{
 
        private int index = 0;
 
        public boolean hasNext() {
            return (index < arraySon.length);
        }
 
        public Node next() {
            return arraySon[index++];
        }  
 
    }
 
    public ArrayNodeIterator iterator(){
        return new ArrayNodeIterator();
    }
}
производный
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
import java.util.Arrays;
 
public class ArrayNodeFirst extends ArrayNode {
    
    public ArrayNodeFirst(Object data) {
        setData(data);
        setParent(this);
    }
 
    @Override
    protected void basicAdd(Node son) {
        int newSize = arraySon.length + 1;
        ArrayNodeFirst[] arr = new ArrayNodeFirst[newSize];
        arr = (ArrayNodeFirst[]) Arrays.copyOf(arraySon, newSize);
        arr[newSize - 1] = (ArrayNodeFirst) son;
        arraySon = arr;
    }
 
    @Override
    public Node createNode(Object data) {
        return new ArrayNodeFirst(data);
    }
 
}
Но в консоле все равно выдает ошибку NullPointerException
Миниатюры
Разветвленные деревья  
0
Кандёхаем веселее!
 Аватар для MLPMan
296 / 330 / 76
Регистрация: 02.10.2012
Сообщений: 2,175
21.07.2015, 21:55
Не инициализировано значит. Надо добавить проверку, чтобы hasNext() возвращал false если нет данных.
1
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 36
21.07.2015, 22:15  [ТС]
Изменил hasNext:
Java
1
2
3
4
5
public boolean hasNext() {
            if(arraySon[index] != null)
                return (index < arraySon.length);
            else return false;
        }
результат тот же...
0
Кандёхаем веселее!
 Аватар для MLPMan
296 / 330 / 76
Регистрация: 02.10.2012
Сообщений: 2,175
21.07.2015, 22:21
roma_m, нет. В массиве может вообще не быть элементов, а это проверка первого.
0
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 36
21.07.2015, 22:37  [ТС]
О! уже что то есть!)
Помогите мне тогда с тем, где правильно выделить память под массив в производном классе: в конструкторе или в add?
0
Кандёхаем веселее!
 Аватар для MLPMan
296 / 330 / 76
Регистрация: 02.10.2012
Сообщений: 2,175
21.07.2015, 22:46
Не знаю. Обычно делают несколько конструкторов, пустой и с данными. Если выберете этот варик, то надо и там и там предусмотреть.
0
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 36
21.07.2015, 22:50  [ТС]
Ну вроде работает. Спасибо)
Есть еще одна проблема: новое дерево не отображается, точнее не корректно отображается: видел только корень
0
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 36
21.07.2015, 22:53  [ТС]
при отладке ошибке или в tree.getRowCount(), или в tree.expandRow(i), или в tree.updateUI(). И исключение в месседж боксе
Миниатюры
Разветвленные деревья  
0
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 36
21.07.2015, 23:07  [ТС]
Все, уже не нужно
Разобрался
Огромное спасибо за помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.07.2015, 23:07
Помогаю со студенческими работами здесь

Разветвленные алгоритмы и программы
Здраствуйте. Я попытался сделать эту задачу...но ничего не выходит...Если Вам не тяжело посмотрите пожалуйста: Вычислить значение...

Разветвленные алгоритмы и программы
Здраствуйте. Можете помочь с этой задачей, если Вам не тяжело: Касса Аэрофлота начинает работу с Т1 часов. С Т2 часов касса закрыта на...

разветвленные алгоритмы в excel
как записать формулу, чтобы в ячейке записывалось значение посчитанное по одной из нескольких формул в зависимости от условия ?. Например...

Разветвленные цепи. Правило обхода контура
ребятки! кто может потолковей объяснить обход контура.....первое правило я понял(кирхгофа) и направление тока(от плюса к минусу), а вот...

Разветвленные программы. Вычислить значение функции в зависимости от условий:
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; using namespace std; int main() { float...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru