2015-02-10 2 views
0

Я работаю над проектом создания сетевого симулятора. Сети, которые я имитирую, являются иерархическими сетями. Я использую структуру данных k-ary tree, а также некоторые дополнительные методы для имитации и анализа некоторых сетей.Простое гетерогенное k-арное дерево в java (для создания сетевого симулятора)

До сих пор у меня есть общая структура данных дерева k-ary, которая принимает общие типы, она отлично работает. Проблема в том, что узлы дерева могут быть только одного типа. Например, если я объявляю дерево с типом String, все узлы должны быть объектами String.

Однако, поскольку я пытаюсь смоделировать компьютерную сеть (или любую другую сеть), некоторые узлы могут иметь быть серверными объектами и некоторые узлы могут быть объектами хоста, или даже маршрутизатор объекта и т.д ...

I хочу, чтобы мои узлы гетерогенного дерева имели некоторые серверные объекты и некоторые объекты mobileDevice ...

Я не нахожу слишком много ответов на это в Google, и это, кажется, проверяет мое творчество. Я знаю абстрактного конструктора дерева синтаксиса под названием ANTL3R или чего-то еще, он якобы может использовать гетерогенные деревья, но мое дерево предназначено для сетей, а не для компиляторов.

ответ

1

Решение состоит в том, чтобы определить interface, что все узлы дерева должны реализовывать. Затем вы можете объявить свое дерево для хранения данных этого типа.

public interface ComputerComponent { 
    String getName(); 
    ComponetType getType(); 
    ... 
} 

Tree<ComputerComponent> network; 

Другой вариант (не рекомендуется), чтобы объявить его, чтобы быть Tree<Object>. Затем вы можете хранить что-нибудь в нем, но вы теряете все возможности проверки типов и в конечном итоге должны будете использовать instanceof и использовать для получения данных, которые вы извлекаете.

+0

Итак, мой класс node будет интерфейсом с переменными String getName() componentType getType() ... Я предполагаю, что когда я фактически добавляюNode() в дерево, я могу добавить узел «Сервер реализует ComputerComponent», и всякий раз, когда я использую toString() на узле, я получу имя объекта обратно? –

+0

Ваш ответ по существу правильный, его же метод использует компиляторы для построения абстрактного синтаксического дерева. Однако я решил пойти по пути дешевле. То, что я делаю, это сделать каждый узел объектом String, и я использую метод charAt() для чтения первого символа, если он равен 1, это сервер, если он является 2, это хозяин .... charAt() во втором месте может быть задержка, и у меня есть дешевая схема для этого –