2011-09-02 3 views
2

Я пытаюсь создать дерево объектов в Java. Я также хочу использовать класс Java, который упрощает добавление или удаление узлов из дерева. Какой будет лучший класс для этой цели?Можно ли создать дерево объектов в Java?

Пример: Вот массив объектов. Объект в верхней части массива - это строка «мир». Листья здесь целые, и я хочу добавить строку «Это в (мир, 0, 0)!» как лист в "(мир, 0, 0)". Какой класс Java лучше всего подходит для этой цели?

"world" 
    /\ 
0 1 
/\ /\ 
0 1 0 1 
+0

Вы описываете, что листья являются целыми числами, но тогда листья являются строками «(мир, 0, 0)». Должна ли она быть той или другой? – oconnor0

+0

@ oconnor0 Я пытаюсь создать дерево объектов (которое может быть любого типа). Это можно сделать на Java, не так ли? –

+1

Абсолютно. Просто используйте 'Object' вместо определенного типа. Я не был уверен, что вам нужно что-то более конкретное. – oconnor0

ответ

10

Сделайте свой собственный. Это просто. Супер супер просто:

public class Tree{ 
    public Node root; 
} 

public class Node{ 
    public ArrayList<Node> children; 
    public Node parent; 
    public String value; 
} 

Теперь, поставив значение строки с последовательностью целых чисел будет сделано что-то вроде этого:

public class Tree{ 
    public String put(String value, int[] path){ 
     Node current = root; 
     for(int i=0;i<path.length;i++){ 
      if(current.children.get(i)==null){ 
       current.children.add(i, new Node()); 
      } 
      current = current.children.get(i); 
     } 
     String ret = current.value; 
     current.value = value; 
    } 
} 

Получение значения будут аналогичны, за исключением того, что вы не перезаписывать текущее значение с заданным значением.

Описание того, что делает put на английском языке:

  • Перейти к п й ребенка текущего узла, где п следующее значение в вашем пути.
  • Если ребенок не существует, создайте его.
  • Повторяйте до тех пор, пока не будет достигнут конец пути.
  • Возврат текущего значения (необязательно)
  • Задайте значение для нового значения.

Таким образом, используя это будет выглядеть примерно так:

Tree myTree = new Tree(); 
myTree.root = new Node(); 
int[] path = {0, 0, 0}; 
myTree.put("hi", path); 
System.out.println(myTree.get(path)); 

И вы получите «привет» в консоли.

+0

Значения иногда являются строками, а иногда и int. Но вопрос не совсем ясен ... – toto2

+0

Самое замечательное в том, что так легко изменить все, что вам нужно. Мне нравится, когда я могу кодировать свои собственные вещи, не ища библиотеки для всего. – bdares

+0

Если вам нужно хранить различные объекты, вы всегда можете сделать тип значения Object вместо String или использовать генераторы класс Tree { public Node root; } класс Node { public ArrayList > children = new ArrayList >(); общественный узел родник; общедоступное значение T; } – user439407

2

Это звучит не так, как домашнее задание. Это? Как правило, это лучше, если это так.

На Java нет структуры данных, которая будет делать то, что вы хотите, поскольку вам кажется, что вас интересует прямая манипуляция деревом. Коллекции Java больше касаются абстрактного типа данных (List, Set, Map), чем специфика реализации резервного копирования; различные реализации предусмотрены для их различных характеристик производительности.

Таким образом, вы, вероятно, лучше всего напишите свой собственный. Если все, что вам действительно интересно, - это сопоставление от одного ключа к значению, то любая из реализаций Карты будет хорошо.

+2

Это не домашнее задание; это часть фрактального генератора, который я создаю для игры. Я хочу, чтобы фрактал был представлен структурой данных дерева, поскольку использование вложенных массивов слишком громоздко. –

+0

Я в основном хочу, чтобы дерево действовало как массив с бесконечным числом измерений, и я хочу создать методы «getter» и «setter» для дерева. Итак, если оператор add («Hi!», 0) был выполнен, то что-то get (0) должно вернуть строку «Hi!». Затем набор операторов (1, 0, 0) добавит целое число 1 как 0-й лист узла (0). –

Смежные вопросы