2012-03-23 2 views
0

Система RELOAD (http://rpg.hamsterrepublic.com/ohrrpgce/RELOAD) используется в GCS OHRRPGCE в качестве системы защиты данных на основе дерева. Узел в этой системе может иметь один из семи типов и любое количество детей.Как обрабатывать многотипную древовидную систему в Java?

В настоящее время я пишу библиотеку сортов для Java для обработки RELOAD через дженерики, но для меня это похоже на kludge. Я делаю это правильно или есть более эффективный способ?

Вот код для абстрактного узла RELOAD:

/** 
* 
*/ 
package hamsterwrench.data.reload; 

import java.util.ArrayList; 

/** 
* @author Matt 
* 
*/ 
public abstract class ReloadNode<T>{ 
    @SuppressWarnings("rawtypes") 
    private ArrayList<ReloadNode> children = new ArrayList<ReloadNode>(); 
    private T data; 
    private long nodeID; 
    private String name; 
    protected ReloadNodeType type; 

    public ReloadNode(long id, String newName){ 
     name = newName; 
     nodeID = id; 
    } 

    public T readData(){ 
     return data; 
    } 

    public void writeData(T input){ 
     data = input; 
    } 

    public String name(){ 
     return name; 
    } 

    public ReloadNodeType type(){ 
     return type; 
    } 

    @SuppressWarnings("rawtypes") 
    public void addChild(ReloadNode r){ 
     children.add(r); 
    } 

    public int numberOfChildren(){ 
     return children.size(); 
    } 

    public boolean removeChild(@SuppressWarnings("rawtypes") ReloadNode r){ 
     return children.remove(r); 
    } 

    @SuppressWarnings("rawtypes") 
    public ReloadNode getChild(int i){ 
     return children.get(i); 
    } 

    public ArrayList<String> getChildrenNames(){ 
     ArrayList<String> result = new ArrayList<String>(); 
     for(int i = 0; i < children.size(); i++){ 
      result.add(children.get(i).name()); 
     } 
     return result; 
    } 

    public long ID(){ 
     return nodeID; 
    } 
} 
+0

Если тип родителя не ограничивает тип дочерних элементов, я не вижу, что вы могли бы получить от дженериков. Мы должны были бы увидеть, как ваш API будет использоваться, чтобы лучше судить об этом. – Joni

+0

Если у вас есть ссылка на существующую реализацию (не-java, вероятно, основанная на спецификации)? Кроме того, что касается переменных Java, то перечисленные 8 типов фактически представляют собой 3: double, int, String. Вы можете захотеть просмотреть хэш-карту, поскольку данные находятся в формате «String tag» - «data». Это очень похоже на json, но более компактно и сложно разобрать. – Thomas

ответ

1

Я не уверен, что вы пытаетесь достичь здесь.

Однако, похоже, что вы перепрофилируете базовую древовидную структуру. Реализация, структура эффективно трудна, и вы, вероятно, пропустите некоторые утилит.

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

Возможно, вы ищете для Красного черного дерева. Что доступна в пакете

java.util.TreeMap

http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.html

если вам нужны более сложные древовидные структуры. Google создал пакет высокоэффективной структуры под названием Guava (бесплатный для загрузки и использования).

Здесь вы можете посмотреть на

com.google.common.collect.TreeBasedTable

http://docs.guava-libraries.googlecode.com/git-history/v11.0.2/javadoc/com/google/common/collect/TreeBasedTable.html

Все thoses структур уже родовым.

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