Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
 Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
Ребята я написала код структуры данных (иерархия) нужно было создать класс "Tree " с datattpe (string (можно было object добавлять))
с функциями add, remove, search, iterate посмотрите код я правильно написала если нет можете подправить)?

package tree;

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


public class Tree<T> {
     private Node<T> root;

    public Tree(T rootData) {
        root = new Node<T>();
        root.data = rootData;
        root.children = new ArrayList<Node<T>>();
    }

    public static class Node<T> {
        private T data;
        private Node<T> parent;
        private List<Node<T>> children;
    }
}
14 авг 18, 08:43    [21641316]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
SQL2008
Member

Откуда:
Сообщений: 3590
На мой взгляд не стоит делать и родительские и дочерние объекты в классе.
Что-то одно.
Но, опять-таки не знаю что вы хотите и может быть вам нужен именно двусвязный список объектов.
14 авг 18, 09:31    [21641362]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
SQL2008,

как можно сделать по вашему чтобы add remove search iterator был (
14 авг 18, 09:33    [21641367]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
SQL2008,

как можно сделать по вашему чтобы add remove search iterator был (
14 авг 18, 09:40    [21641371]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
nastyaa,
примено вот так да?
 public TreeNode<T> addChild(T child) {
        TreeNode<T> childNode = new TreeNode<T>(child);
        childNode.parent = this;
        this.children.add(childNode);
        return childNode;
    }
14 авг 18, 09:41    [21641375]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
SQL2008
Member

Откуда:
Сообщений: 3590
Я бы лучше связывался через родительский элемент, так как он (как мне кажется) создается раньше, чем дочерний.
14 авг 18, 09:45    [21641378]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
SQL2008,

как можно это сделать? можете написать код пожалуйста)
14 авг 18, 09:46    [21641383]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
SQL2008
Member

Откуда:
Сообщений: 3590
nastyaa
nastyaa,
примено вот так да?
 public TreeNode<T> addChild(T child) {
        TreeNode<T> childNode = new TreeNode<T>(child);
        childNode.parent = this;
        this.children.add(childNode);
        return childNode;
    }

Нет, зачем вам создавать TreeNode<T> childNode = new TreeNode<T>(child);?
Просто добавляйте существующий child в this.children.
Что-то типа
 public void addChild(T child) {
        this.children.add(childNode);
    }

Впрочем могу ошибаться :)
14 авг 18, 09:51    [21641391]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
SQL2008,
вот так?
public abstract class Tree<T> implements Iterable<Tree<T>> {

    T data;
    Tree<T> parent;
    List<Tree<T>> children;

    public Tree(T data) {
        this.data = data;
        this.children = new LinkedList<Tree<T>>();
    }

     public void addChild(T child) {
        Tree<T> childNode = null;
        this.children.add(childNode);
    }
    
14 авг 18, 09:53    [21641394]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
SQL2008
Member

Откуда:
Сообщений: 3590
А почему вы добавляете null объект в коллекцию дочерний, имея существующий child?
     public void addChild(T child) {
        Tree<T> childNode = null;
        this.children.add(childNode);
    }

Почему не так
     
public void setParent(Tree<T> child) {
        this.parent = child;
}

public void addChild(T child) {
        child.setParent(this);
        this.children.add(child);
    }


Боюсь, что я вас окончательно запутаю :)
14 авг 18, 10:04    [21641405]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
SQL2008,

ошибка(

К сообщению приложен файл. Размер - 114Kb
14 авг 18, 10:23    [21641426]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
SQL2008
Member

Откуда:
Сообщений: 3590
nastyaa
SQL2008,
ошибка(

Я предупреждал, что могу ошибаться :)
дело в том, что передаваемый тип (T child) не есть объект класса Tree<T> (тут я ошибся, каюсь)
и у него нет метода setParent.

Выход попробовать передавать
public void addChild(Tree<T> child) {
        child.setParent(this);
        this.children.add(child);
    }
14 авг 18, 10:54    [21641460]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
SQL2008,

Спасибо) как можно добавить add, remove, search, iterate я пишу но ошибку выводит
14 авг 18, 11:15    [21641513]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
SQL2008,

К сообщению приложен файл. Размер - 117Kb
14 авг 18, 11:16    [21641514]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
Valentin Kolesnikov
Member

Откуда:
Сообщений: 3035
nastyaa,

Вот такое решение:

Main.java:

package tree;

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Node node = new Node("name", null, 0L);
        int foundForName = findByName(node, "name").size();
        int foundForName1 = findByName(node, "name1").size();
        System.out.println("found for name - " + foundForName);
        System.out.println("found for name1 - " + foundForName1);

        Tree tree = new Tree("name", null);
        tree.add(node);
        int foundForNameInTree = findByName(tree, "name").size();
        System.out.println("found for name in tree - " + foundForNameInTree);

        Tree tree2 = new Tree("name", null);
        tree2.add(node);
        tree.add(tree2);
        int foundForNameInTree2 = findByName(tree, "name").size();
        System.out.println("found for name in tree 2 - " + foundForNameInTree2);

    }

    public static List<Entry> findByName(final Entry entry, final String name) {
        final List<Entry> result = new ArrayList<Entry>();
        final Queue<Entry> allFiles = new LinkedList<Entry>();
        allFiles.add(entry);
        while (!allFiles.isEmpty()) {
            final Entry localEntry = allFiles.poll();
            if (localEntry instanceof Tree) {
                final List<Entry> files = ((Tree) localEntry).iterate();
                for (final Entry innerFile : files) {
                    if (innerFile instanceof Tree) {
                        allFiles.add(innerFile);
                    } else if (innerFile.getName().equals(name)) {
                        result.add(innerFile);
                    }
                }
            } else if (localEntry.getName().equals(name)) {
                result.add(localEntry);
            }
        }
        return result;
    }
}


Entry.java:

package tree;

public abstract class Entry {
    private final Tree parent;
    private final long created;
    private String name;
    private long lastUpdated;
    private long lastAccessed;

    public Entry(String name, Tree parent) {
        this.name = name;
        this.parent = parent;
        this.created = System.currentTimeMillis();
    }

    public boolean delete() {
        if (parent == null) {
            return false;
        }
        return parent.remove(this);
    }

    public abstract long size();

    public String getFullPath() {
        if (parent == null) {
            return name;
        } else {
            return parent.getFullPath() + "/" + name;
        }
    }

    public long getCreationTime() {
        return created;
    }

    public long getLastUpdated() {
        return lastUpdated;
    }

    public long getLastAccessed() {
        return lastAccessed;
    }

    public void setLastUpdated(long lastUpdated) {
        this.lastUpdated = lastUpdated;
    }

    public void setLastAccessed(long lastAccessed) {
        this.lastAccessed = lastAccessed;
    }

    public void changeName(String newName) {
        this.name = newName;
        this.lastUpdated = System.currentTimeMillis();
    }

    public String getName() {
        return name;
    }
}


Node.java:

package tree;

public class Node extends Entry {
    private final java.io.ByteArrayOutputStream stream;
    private final long size;

    public Node(String name, Tree parent, long size) {
        super(name, parent);
        this.size = size;
        this.stream = new java.io.ByteArrayOutputStream();
    }

    public long size() {
        return size;
    }

    public byte[] getContents() {
        setLastAccessed(System.currentTimeMillis());
        return stream.toByteArray();
    }

    public void setContents(byte[] content) {
        this.stream.write(content, 0, content.length);
        setLastUpdated(System.currentTimeMillis());
    }
}


Tree.java:

package tree;

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

public class Tree extends Entry {
    private final List<Entry> contents;

    public Tree(String name, Tree tree) {
        super(name, tree);
        contents = new ArrayList<Entry>();
    }

    protected List<Entry> iterate() {
        return contents;
    }

    public long size() {
        long size = 0;
        for (final Entry entry : contents) {
            size += entry.size();
        }
        return size;
    }

    public boolean remove(Entry entry) {
        return contents.remove(entry);
    }

    public void add(Entry entry) {
        contents.add(entry);
    }
}


С уважением, Валентин
14 авг 18, 14:23    [21641901]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
Valentin Kolesnikov,

Спасибо вам большое)))
Ваше решение похоже на то мне сказали чтобы внутри класса Tree нужно создать class Node и внутри мутить add и тд ??
14 авг 18, 14:41    [21641942]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
Valentin Kolesnikov,

Можете некоторые места закомментировать(( я просто только сегодня познакомилась с Tree и Datatype некоторые места непонятны, если конечно у вас время будет. А так вы мой спаситель люблю вас!!)
14 авг 18, 14:44    [21641946]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
Valentin Kolesnikov
Member

Откуда:
Сообщений: 3035
nastyaa
Valentin Kolesnikov,

Можете некоторые места закомментировать(( я просто только сегодня познакомилась с Tree и Datatype некоторые места непонятны, если конечно у вас время будет. А так вы мой спаситель люблю вас!!)


Новая версия:

Main.java:

package tree;

public class Main {

    public static void main(String[] args) {
        Node node = new Node("name", null, 0L);
        int foundForName = node.findByName("name").size();
        int foundForName1 = node.findByName("name1").size();
        System.out.println("found for name - " + foundForName);
        System.out.println("found for name1 - " + foundForName1);

        Tree tree = new Tree("name", null);
        tree.add(node);
        int foundForNameInTree = tree.findByName("name").size();
        System.out.println("found for name in tree - " + foundForNameInTree);

        Tree tree2 = new Tree("name", null);
        tree2.add(node);
        tree.add(tree2);
        int foundForNameInTree2 = tree.findByName("name").size();
        System.out.println("found for name in tree 2 - " + foundForNameInTree2);

    }
}

Entry.java:

package tree;

import java.util.*;

public abstract class Entry {
    private final Tree parent;
    private String name;

    public Entry(String name, Tree parent) {
        this.name = name;
        this.parent = parent;
    }

    public boolean delete() {
        if (parent == null) {
            return false;
        }
        return parent.remove(this);
    }

    public abstract long size();

    public String getFullPath() {
        if (parent == null) {
            return name;
        } else {
            return parent.getFullPath() + "/" + name;
        }
    }

    public void changeName(String newName) {
        this.name = newName;
    }

    public String getName() {
        return name;
    }

    public List<Entry> findByName(final String name) {
        final List<Entry> result = new ArrayList<Entry>();
        final Queue<Entry> allFiles = new LinkedList<Entry>();
        allFiles.add(this);
        while (!allFiles.isEmpty()) {
            final Entry localEntry = allFiles.poll();
            if (localEntry instanceof Tree) {
                final List<Entry> files = ((Tree) localEntry).iterate();
                for (final Entry innerFile : files) {
                    if (innerFile instanceof Tree) {
                        allFiles.add(innerFile);
                    } else if (innerFile.getName().equals(name)) {
                        result.add(innerFile);
                    }
                }
            } else if (localEntry.getName().equals(name)) {
                result.add(localEntry);
            }
        }
        return result;
    }
}

Node.java:

package tree;

public class Node extends Entry {
    private final java.io.ByteArrayOutputStream stream;
    private final long size;

    public Node(String name, Tree parent, long size) {
        super(name, parent);
        this.size = size;
        this.stream = new java.io.ByteArrayOutputStream();
    }

    public long size() {
        return size;
    }

    public byte[] getContents() {
        return stream.toByteArray();
    }

    public void setContents(byte[] content) {
        this.stream.write(content, 0, content.length);
    }
}

Tree.java:

package tree;

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

public class Tree extends Entry {
    private final List<Entry> contents;

    public Tree(String name, Tree tree) {
        super(name, tree);
        contents = new ArrayList<Entry>();
    }

    protected List<Entry> iterate() {
        return contents;
    }

    public long size() {
        long size = 0;
        for (final Entry entry : contents) {
            size += entry.size();
        }
        return size;
    }

    public boolean remove(Entry entry) {
        return contents.remove(entry);
    }

    public void add(Entry entry) {
        contents.add(entry);
    }
}


С уважением, Валентин
14 авг 18, 14:58    [21641967]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
Valentin Kolesnikov,

это весь код?)
15 авг 18, 06:08    [21642498]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
Valentin Kolesnikov,

ошибка(

К сообщению приложен файл. Размер - 127Kb
15 авг 18, 06:15    [21642499]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
Valentin Kolesnikov,

ошибка в main
(

К сообщению приложен файл. Размер - 120Kb
15 авг 18, 06:15    [21642500]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
Valentin Kolesnikov,

ошибка в node(

К сообщению приложен файл. Размер - 148Kb
15 авг 18, 06:16    [21642501]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
Valentin Kolesnikov,

ошибка в tree(

К сообщению приложен файл. Размер - 117Kb
15 авг 18, 06:16    [21642502]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
Valentin Kolesnikov,

выводит главный класс найти не удалось(
15 авг 18, 06:17    [21642503]     Ответить | Цитировать Сообщить модератору
 Re: Структура данных  [new]
nastyaa
Member

Откуда:
Сообщений: 330
Valentin Kolesnikov,

Я все решила проблему))
Можно спросить что здесь выводит
found for name - 1
found for name1 - 0
found for name in tree - 1
found for name in tree 2 - 2
15 авг 18, 07:42    [21642518]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
Все форумы / Java Ответить